武汉理工大学《能力拓展训练》说明书
while (!IRIN) //等IR变为高电平,跳过9ms的前导低电平信号。 {delay0(1);} for (j=0;j<4;j++) //收集四组数据 { for (i=0;i<8;i++) //每组数据有8位 { while (IRIN); //等IR变为低电平,跳过4.5ms的前导高电平信号。 while (!IRIN); //等IR变为高电平 while (IRIN) //计算IR高电平时长 { delay0(1); N++; if (N>=30) { EX0=1; return; } //0.14ms计数过长自动离开。 } //高电平计数完毕 Reive[j]=Reive[j] >> 1; //数据最高位补“0” if (N>=8) {Reive[j] = Reive[j] | 0x80;} //数据最高位补“1” N=0; }//end for i }//end for j if (Reive[2]!=~Reive[3]) { EX0=1; return; } yaokong=Reive[2]; flag=Code_Chang(yaokong); if(flag>0&&flag<5) { Last=flag; } EX0=1; }
/********************************************************* * 主函数 */ void main() { uchar line=8; // Last=flag; IE = 0x81; TCON = 0x01;
16
武汉理工大学《能力拓展训练》说明书
}
IRIN=1;
delay1(100); //上电,等待稳定 init_display(); while(1) { switch (flag) { case 0:break; case 1:picture_move_Up(Photo1,8);break; case 2:picture_move_Down(Photo1,Photo3,8);break; case 3:picture_mov_Left(Photo1,Photo2); picture_mov_Left(Photo2,Photo1);break; case 4:picture_mov_Right(Photo2,Photo1); picture_mov_Right(Photo1,Photo2);break; case 6:flag=Last;break; default:flag=0;break; } }
4.2.2 液晶显示函数文件12864.h
#include
#define uchar unsigned char #define uint unsigned int
uint time=2000,flag=0;//闪烁间隔时间--显示方式标志位flag /************* 12864LCD引脚定义 *************/ #define LCD_data P0 //数据口
sbit LCD_RS = P2^0; //寄存器选择输入 sbit LCD_RW = P2^1; //液晶读/写控制 sbit LCD_EN = P2^2; //液晶使能控制 sbit LCD_PSB = P2^3; //串/并方式控制 sbit LCD_RST = P2^5; //液晶复位端口
#define delayNOP(); {_nop_();_nop_();_nop_();_nop_();};
/*********************************************************/ uchar code DIS1[] = {\ 武汉理工大学 %uchar code DIS2[] = {%uchar code DIS3[] = {\ 能力扩展训练 %uchar code DIS4[] = {\电信0805 23号 \
/*********************************************************/ /* 图像字模省略 */ /*********************************************************/ uchar code Photo1[] ={}; uchar code Photo2[]={};
17
武汉理工大学《能力拓展训练》说明书
uchar code Photo3[1]={0};//该数组为调用前面的数据用
/*******************************************************************/ /* 延时函数 */ void delay1(int ms) {
while(ms--) {
uchar y; for(y=0;y<100;y++) ; } }
/*******************************************************************/ /*检查LCD忙状态 */ bit lcd_busy()
{ bit result; LCD_RS = 0; LCD_RW = 1; LCD_EN = 1; delayNOP();
result = (bit)(P0&0x80); LCD_EN = 0; return(result); }
/*******************************************************************/ /*写指令数据到LCD */ void lcd_wcmd(uchar cmd)
{ while(lcd_busy()); LCD_RS = 0; LCD_RW = 0; LCD_EN = 0; _nop_(); _nop_(); P0 = cmd; delayNOP(); LCD_EN = 1; delayNOP(); LCD_EN = 0; }
/*******************************************************************/ /*写显示数据到LCD */ void lcd_wdat(uchar dat)
{
18
武汉理工大学《能力拓展训练》说明书
while(lcd_busy()); LCD_RS = 1; LCD_RW = 0; LCD_EN = 0; P0 = dat; delayNOP(); LCD_EN = 1; delayNOP(); LCD_EN = 0; }
/*******************************************************************/ /* LCD初始化设定 */ void lcd_init() {
LCD_PSB = 1; //并口方式 LCD_RST = 0; //液晶复位 delay1(3); LCD_RST = 1; delay1(3);
lcd_wcmd(0x34); //扩充指令操作 delay1(5);
lcd_wcmd(0x30); //基本指令操作 delay1(5);
lcd_wcmd(0x0C); //显示开,关光标 delay1(5);
lcd_wcmd(0x01); //清除LCD的显示内容 delay1(5); }
/*********************************************************/ /* 设定显示位置 */ void lcd_pos(uchar X,uchar Y) { uchar pos; if (X==1) {X=0x80;} else if (X==2) {X=0x90;} else if (X==3) {X=0x88;} else if (X==4) {X=0x98;} pos = X+Y ;
lcd_wcmd(pos); //显示地址
19
武汉理工大学《能力拓展训练》说明书
}
/********************************************************* * 闪烁函数 */ void lcdflag(uint z) {
lcd_wcmd(0x08); delay1(z);
lcd_wcmd(0x0c); delay1(z);
lcd_wcmd(0x08); delay1(z);
lcd_wcmd(0x0c); delay1(z);
lcd_wcmd(0x08); delay1(200);
lcd_wcmd(0x0c); delay1(5);
lcd_wcmd(0x01); delay1(5); }
/********************************************************* * 图形显示 */ void photodisplay(uchar *bmp) {
uchar i,j;
lcd_wcmd(0x34); //写数据时,关闭图形显示 for(i=0;i<32;i++) {
lcd_wcmd(0x80+i); //先写入水平坐标值 lcd_wcmd(0x80); //写入垂直坐标值
for(j=0;j<16;j++) //再写入两个8位元的数据 lcd_wdat(*bmp++); delay1(1); }
for(i=0;i<32;i++) {
lcd_wcmd(0x80+i); lcd_wcmd(0x88);
for(j=0;j<16;j++) lcd_wdat(*bmp++); delay1(1); }
lcd_wcmd(0x36); //写完数据,开图形显示 }
20