S3C440Box嵌入式系统实验报告.docx
《S3C440Box嵌入式系统实验报告.docx》由会员分享,可在线阅读,更多相关《S3C440Box嵌入式系统实验报告.docx(33页珍藏版)》请在冰豆网上搜索。
![S3C440Box嵌入式系统实验报告.docx](https://file1.bdocx.com/fileroot1/2023-1/21/b72b4653-9ad7-402b-a4b2-f4aeb8c297f5/b72b4653-9ad7-402b-a4b2-f4aeb8c297f51.gif)
S3C440Box嵌入式系统实验报告
嵌入式系统
实
验
报
告
姓名:
努尔买买提·吐孙
学号:
12600123
班级:
计算机科学与技术非师范121班
实验一LCD控制
一、实验目的
1、初步掌握液晶显示屏的使用及其电路设计方法。
2、掌握S3C44B0X处理器的LCD控制器的使用。
3、通过实验掌握液晶显示文本和图形的方法以及程序设计方法。
二、实验内容
学习LCD显示器的基本原理,理解其驱动的控制方法。
掌握S3C44B0X处理器的基本原理和方法,并编程实现:
1、画出多个矩形框
2、显示ASCII字符
3、显示汉字字符
三、实验流程图
四、实验核心代码
#include"44b.h"
#include"uhal.h"
#include"option.h"
#include"def.h"
#pragmaimport(__use_no_semihosting_swi)//ensurenofunctionsthatusesemihosting
externU32LCDBuffer[240][320];
intmain(void)
{
inti,j,k;
U32jcolor;
ARMTargetInit();//开发版初始化
LCD_Init();//LCD初始化
for(k=10;k<200;k++)
LCDBuffer[k][10]=0x000000e0;
for(k=10;k<200;k++)
LCDBuffer[k][100]=0x000000e0;
for(j=10;j<100;j++)
LCDBuffer[10][j]=0x000000e0;
for(j=10;j<100;j++)
LCDBuffer[200][j]=0x000000e0;
LCD_Refresh();
while
(1);
return0;
}
实验二键盘控制实验
一、实验目的
1、学习键盘及LED驱动原理。
2、掌握ZLG7289芯片的使用方法。
二、实验内容
通过ZLG7289芯片驱动17键的键盘和8个共阴极LED,将按键值在LED上面显示出来。
三、实验流程图
1、定义ZLG7289寄存器(zlg7289.h)
2、定义键值读取函数
否
是
否
是
3、编写主函数,将键值在数码管上显示
否
是
四、实验核心代码:
#include"uhal.h"
#include"keyboard.h"
#include"zlg7289.h"
#include"44b.h"
#include"myuart.h"
#include"LCD320.h"
#pragmaimport(__use_no_semihosting_swi)
externintZlg7289SIOBand;
externintZlg7289SIOCtrl;
intmain(void)
{
U32key;
ARMTargetInit();//开发版初始化
Uart_Printf("\nArmTargetInitOK.");
Zlg7289_Reset();//zlg7289复位
ARMTargetInit();//开发版初始化
LCD_Init();
LCD_ChangeMode(DspTxtMode);//转换LCD显示模式为文本显示模式
LCD_Cls();//文本模式下清屏命令
while
(1)
{key=GetKey();//得到按键值
Delay(7000);
switch(key)
{
case(0):
LCD_printf("NUM\n");
Uart_Printf("\nNUM\n");
break;
case
(1):
LCD_printf("/\n");
Uart_Printf("\n1\n");
break;
case
(2):
LCD_printf("*\n");
Uart_Printf("\n2\n");
break;
case(3):
LCD_printf("-\n");
Uart_Printf("\n3\n");break;
case(4):
LCD_printf("7\n");
Uart_Printf("\n4\n");break;
case(5):
LCD_printf("8\n");
Uart_Printf("\n5\n");break;
case(6):
LCD_printf("9\n");
Uart_Printf("\n6\n");break;
case(7):
LCD_printf("+\n");
Uart_Printf("\n7\n");break;
case(8):
LCD_printf("4\n");
Uart_Printf("\n8\n");break;
case(9):
LCD_printf("5\n");
Uart_Printf("\n9\n");break;
case(10):
LCD_printf("6\n");
Uart_Printf("\nNUMLOCK\n");break;
case(11):
LCD_printf("1\n");
Uart_Printf("\n/\n");break;
case(12):
LCD_printf("2\n");
Uart_Printf("\n*\n");break;
case(13):
LCD_printf("3\n");
Uart_Printf("\n-\n");break;
case(14):
LCD_printf("Enter\n");
Uart_Printf("\nEnter\n");break;
case(15):
LCD_printf("0\n");
Uart_Printf("\n+\n");break;
case(16):
LCD_printf("Dle\n");
Uart_Printf("\nDle\n");break;
}
ZLG7289_ENABLE();//使zlg7289占有同步串口
Delay(5);//延时
WriteSDIO(ZLG7289_CMD_DATA0|0);//数码管以方式0译码,第一个
数码管亮
//WriteSDIO(key);//显示个位
Delay
(1);//延时*/
if(key>=4&&key<16)
{
switch(key)
{
case(4):
WriteSDIO(7);
Delay
(1);
break;
case(5):
WriteSDIO(8);
Delay
(1);
break;
case(6):
WriteSDIO(9);
Delay
(1);
break;
case(8):
WriteSDIO(4);
Delay
(1);
break;
case(9):
WriteSDIO(5);
Delay
(1);
break;
case(10):
WriteSDIO(6);
Delay
(1);
break;
case(11):
WriteSDIO
(1);
Delay
(1);
break;
case(12):
WriteSDIO
(2);
Delay
(1);
break;
case(13):
WriteSDIO(3);
Delay
(1);
break;
case(15):
WriteSDIO(0);
Delay
(1);
break;
}
}
ZLG7289_DISABLE();//zlg7289放弃同步串口控制权
}
return0;
}
五、实验体会
在本次实验,熟悉了键盘以及LED的驱动原理。
键盘的闭合键,通常采用两种方法,即行扫描法和行反转法获取键值。
同时还了解了ZLG7289芯片的特点和基本使用方法。
实验三A/D接口实验
一、实验目的
1、熟悉ARM本身自带的八路十位A/D控制器及相应寄存器。
2、编程实现ARM系统的A/D功能,掌握带有A/D的CPU编程实现A/D功能的主要方法。
二、实验内容
学习A/D和LCD接口原理,了解实现A/D和LCD系统对于系统的软件和硬件要求。
阅读ARM芯片文档,掌握ARM的A/D和LCD相关寄存器的功能,熟悉ARM系统硬件的A/D和LCD相关接口。
利用外部模拟信号编程实现ARM循环采集全部前4路通道,并且在LCD上动态显示曲线。
每个通道以不同颜色的画笔绘制曲线。
三、实验流程图
1、获取转换结果函数
否
是
四、实验核心代码
#include"44b.h"
#include"uhal.h"
#include"option.h"
#include"def.h"
#include"myuart.h"
#include"LCD320.h"
externU32LCDBuffer[240][320];
#pragmaimport(__use_no_semihosting_swi)
#defineADCCON_FLAG0x40
#defineADCCON_SLEEP0x20
#defineADCCON_ADIN0(0x0<<2)
#defineADCCON_ADIN1(0x1<<2)
#defineADCCON_ADIN2(0x2<<2)
#defineADCCON_ADIN3(0x3<<2)
#defineADCCON_ADIN4(0x4<<2)
#defineADCCON_ADIN5(0x5<<2)
#defineADCCON_ADIN6(0x6<<2)
#defineADCCON_ADIN7(0x7<<2)
#defineADCCON_READ_START0x2
#defineADCCON_ENABLE_START0x1
voidinit_ADdevice()
{//初始化
rADCPSR=20;
rADCCON=ADCCON_SLEEP;
}
intGetADresult(intchannel)
{
rADCCON=(channel<<2)|ADCCON_ENABLE_START;
Delay(10);
while(!
(rADCCON&ADCCON_FLAG));//转换结束
returnrADCDAT;//返回采样值
}
intmain(void)
{
U32jcolor;
U32jcolor1;
U32jcolor2;
U32jcolor3;
intmid;
intfs;
inti,j,k,s,t;
intpre[4];
floatd;
ARMTargetInit();//开发版初始化
init_ADdevice();
Uart_Printf("\n");
LCD_Init();
jcolor=0x0000e0e0;
jcolor1=0x000000e0;
jcolor2=0x00e0e0e0;
jcolor3=0x0000e000;
t=320;
while
(1)
{
if(t==320)
{//采样0~3路A/D值
t=0;
for(k=0;k<240;k++)
for(j=0;j<320;j++)
LCDBuffer[k][j]=0x00000000;//背景黑色
}
for(i=0;i<1;i++)
{
d=GetADresult(i)*2.5/1023;
s=(int)(d*15);
fs=55*(i+1)-s;
LCDBuffer[fs][t]=jcolor;//线条颜色
if(t!
=0)
{
mid=(pre[i]+fs)/2;
for(k=pre[i];kLCDBuffer[k][t-1]=jcolor;
for(k=mid;kLCDBuffer[k][t]=jcolor;
for(k=mid;k
LCDBuffer[k][t-1]=jcolor;
for(k=fs;kLCDBuffer[k][t]=jcolor;
}
pre[i]=fs;
}
for(i=1;i<2;i++)
{
d=GetADresult(i)*2.5/1023;
s=(int)(d*15);
fs=55*(i+1)-s;
LCDBuffer[fs][t]=jcolor1;//线条颜色
if(t!
=0)
{
mid=(pre[i]+fs)/2;
for(k=pre[i];kLCDBuffer[k][t-1]=jcolor1;
for(k=mid;kLCDBuffer[k][t]=jcolor1;
for(k=mid;k
LCDBuffer[k][t-1]=jcolor1;
for(k=fs;kLCDBuffer[k][t]=jcolor1;
}
pre[i]=fs;
}
for(i=2;i<3;i++)
{
d=GetADresult(i)*2.5/1023;
s=(int)(d*15);
fs=55*(i+1)-s;
LCDBuffer[fs][t]=jcolor2;//线条颜色
if(t!
=0)
{
mid=(pre[i]+fs)/2;
for(k=pre[i];kLCDBuffer[k][t-1]=jcolor2;
for(k=mid;kLCDBuffer[k][t]=jcolor2;
for(k=mid;k
LCDBuffer[k][t-1]=jcolor2;
for(k=fs;kLCDBuffer[k][t]=jcolor2;
}
pre[i]=fs;
}
for(i=3;i<4;i++)
{
d=GetADresult(i)*2.5/1023;
s=(int)(d*15);
fs=55*(i+1)-s;
LCDBuffer[fs][t]=jcolor3;//线条颜色
if(t!
=0)
{
mid=(pre[i]+fs)/2;
for(k=pre[i];kLCDBuffer[k][t-1]=jcolor3;
for(k=mid;kLCDBuffer[k][t]=jcolor3;
for(k=mid;k
LCDBuffer[k][t-1]=jcolor3;
for(k=fs;kLCDBuffer[k][t]=jcolor3;
}
pre[i]=fs;
}
LCD_Refresh();
t++;
Uart_Printf("\r");
}
return0;
}
实验四触摸屏驱动实验
一、实验目的
1、了解触摸屏基本概念及原理。
2、理解触摸屏与LCD的密切配合。
3、编程实现对触摸屏的控制。
二、实验内容
结合液晶显示控制实验,编写程序获取用户输入的4个坐标位置,并在液晶上画出由用户输入的坐标组成的矩形。
三、实验流程图
1、读取触摸点x轴电压值
2、读取触摸点坐标3、判断触摸动作
四、实验核心代码
#include"44b.h"
#include"LCD320.h"
#include"tchScr.h"
#include"maro.h"
#defineADS7843_CMD_X(ADS7843_CTRL_START|ADS7843_GET_X|ADS7843_CTRL_12MODE|ADS7843_CTRL_DFR|ADS7843_CTRL_ENPWD)
//采样x轴电压值,数据为12位,参考电压输入模式为差分模式,允许省电模式
#defineADS7843_CMD_Y(ADS7843_CTRL_START|ADS7843_GET_Y|ADS7843_CTRL_12MODE|ADS7843_CTRL_DFR|ADS7843_CTRL_ENPWD)
externU32LCDBuffer[240][320];
IntTchScr_Xmax=1876,TchScr_Xmin=269,TchScr_Ymax=229,
TchScr_Ymin=1725;//触摸屏返回电压值范围
voidTchScr_GetScrXY(int*x,int*y,U8bCal)
{//获得触摸点坐标
unsignedinttemp;
rPDATF&=~ADS7843_PIN_CS;//打开ADS7843
SendSIOData(ADS7843_CMD_X);//发送读取x电压值控制字
SendSIOData(0);//等待8个时钟节拍,因为完成一转换需要16个时钟
temp=ReadSIOData();//读取采样值高8位
SendSIOData(ADS7843_CMD_X);
temp<<=8;
temp|=ReadSIOData();//读取低8位并与以前高8位组成16位数据
*x=(temp>>4);//去掉低4位,保留12位有效数据
SendSIOData(0);
temp=ReadSIOData();
SendSIOData(ADS7843_CMD_X);
temp<<=8;
temp|=ReadSIOData();
*x+=(temp>>4);
SendSIOData(0);
temp=ReadSIOData();
SendSIOData(ADS7843_CMD_X);
temp<<=8;
temp|=ReadSIOData();
*x+=(temp>>4);
SendSIOData(0);
temp=ReadSIOData();
SendSIOData(ADS7843_CMD_Y);
temp<<=8;
temp|=ReadSIOData();
*x+=(temp>>4);
*x>>=2;//采样4次取平均值
//读取y电压值
SendSIOData(0);
temp=ReadSIOData();
SendSIOData(ADS7843_CMD_Y);
temp<<=8;
temp|=ReadSIOData();
*y=(temp>>4);
SendSIOData(0);
temp=ReadSIOData();
SendSIOData(ADS7843_CMD_Y);
temp<<=8;
temp|=ReadSIOData();
*y+=(temp>>4);
SendSIOData(0);
temp=ReadSIOData();
SendSIOData(ADS7843_CMD_Y);
temp<<=8;
temp|=ReadSIOData();
*y+=(temp>>4);
SendSIOData(0);
temp=ReadSIOData();
SendSIOData(0);
temp<<=8;
temp|=ReadSIOData();
*y+=(temp>>4);
*y>>=2;
rPDATF|=ADS7843_PIN_CS;//关闭ADS7843
if(bCal){//对采样结果进行转换
*x=(*x-TchScr_Xmin)*LCDWIDTH/(TchScr_Xmax-TchScr_Xmin);
*y=(*y-TchScr_Ymin)*LCDHEIGHT/(TchScr_Ymax-TchScr_Ymin);
}
}
U32TchScr_GetOSXY(int*x,int*y)
{//获得触摸点坐标并返回触摸动作
staticU32mode=0;
staticintoldx,oldy;
inti,j;
for(;;){
if((mode!
=TCHSCR_ACTION_DOWN)&&(mode!
=TCHSCR_ACTION_MOVE)){
if(!
TCHSCR_IsPenNotDown){//有触摸动作
TchScr_GetScrXY(x,y,TRUE);//得到触摸点坐标
for(i=0;i<40;i++){
if(TCHSCR_IsPenNotDown)//抬起
break;
Delay(100);
}
if(i<40){//在规定的双击时间之内抬起,检测是不是及时按下
for(i=0;i<60;i++){
if(!
TCHSCR_IsPenNotDown){
if(i<10){i=60;break;}//如果单击后很短时间内按下,不视为双击
mode=TCHSCR_ACTION_DBCLICK;
for(j=0;j<40;j++)Delay(100);//检测到双击后延时,防止拖尾
break;
}
Delay(100);
}
if(i==60)