📄 12232_demo.c
字号:
LCD_WCMDR = X; /*命令输入到数据口 */
// Delay(2);
}
/********************************************************/
/*根据设定的坐标数据,定位LCM上的下一个操作单元位置 */
/********************************************************/
void LocatexyL(void)//左半屏
{
unsigned char x,y;
x = col&0x3F|SETX; /* 页col.and.0x3f.or.setx */
y = row&0x07|SETY; /* 行row.and.0x07.or.sety */
WrcmdL(x);
WrcmdL(y);
}
void LocatexyR(void)//右半屏
{
unsigned char x,y;
x = col&0x3F|SETX; /* 页col.and.0x3f.or.setx */
y = row&0x07|SETY; /* 行row.and.0x07.or.sety */
WrcmdR(x);
WrcmdR(y);
}
/********************************/
/*液晶屏初始化 */
/********************************/
void Lcminit(void)
{
cbyte = DISPOFF; /*关闭显示屏 */
WrcmdL(cbyte);
WrcmdR(cbyte);
cbyte = DISPON; /*打开显示屏 */
WrcmdL(cbyte);
WrcmdR(cbyte);
cbyte = DISPFIRST; /*定义显示起始行为零 */
WrcmdL(cbyte);
WrcmdR(cbyte);
Lcmcls(); /*清屏 */
col=0;
row=0;
LocatexyL();
LocatexyR();
}
/*************************** 点阵模块****************************************/
/*==================== 演示程序 =======================*/
void demo(uchar *s1,uchar *s2)
{
uint tmp,tp;
uchar j,i,col1,col2,tab1,tab2,disp_tmp1,disp_tmp2,tmp1,tmp2;
tmp=0;
while(tmp<108)
{
tp=tmp;
for(i=0;i<8;i++)
{
col1=0x80;
P1=0xff;
P3=0xff ;
for(j=0;j<8;j++)
{
disp_tmp1=*(s1+tmp);
disp_tmp2=*(s2+tmp);
tmp1=disp_tmp1^0xff;
tmp2=disp_tmp2^0xff;
col2=col1^0xff;
P3=col2;
P0=tmp1;
P2=tmp2;
tmp++;
col1>>=1;
delay(1);
}
delay(1);
P3=0xff;
P1=0xff;
tab1=0x80;
for(j=0;j<8;j++)
{
disp_tmp1=*(s1+tmp);
disp_tmp2=*(s2+tmp);
tmp1=disp_tmp1^0xff;
tmp2=disp_tmp2^0xff;
tab2=tab1^0xff;
P1=tab2;
P0=tmp1;
P2=tmp2;
tmp++;
tab1>>=1;
delay(1);
}
tmp=tp;
}
tmp+=1;
}
}
/************************键盘模块******************************/
void Send_data(uchar Sdata) //发送数据
{
uchar i;
for(i=0;i<8;i++)
{
key_clk=0;
key_dat=Sdata&0x80;
_nop_();
_nop_();
key_clk=1;
_nop_();
_nop_();
Sdata<<=1;
}
}
void key_led(void) //键盘显示
{
uchar scan_tmp,key_tmp,i;
uint time;
bit tmp;
scan_tmp=0;
while(time<5000)
{
for(i=0;i<8;i++)
{
time++;
scan_tmp++;
key_tmp=scan_tmp; //改变A B C 的值产生扫描码
key_A=key_tmp&0x01;
key_B=key_tmp&0x02;
key_C=scan_tmp&0x04;
scan_tmp=scan_tmp&0x07;
tmp=key_down1;
delay(1);
if(tmp&1==1) continue; //无键返回
switch(scan_tmp) // 输出查表
{
case 0x00:Send_data(0xf9);break;
case 0x01:Send_data(0xa4);break;
case 0x02:Send_data(0xb0);break;
case 0x03:Send_data(0x99);break;
case 0x04:Send_data(0x92);break;
case 0x05:Send_data(0x82);break;
case 0x06:Send_data(0xf8);break;
case 0x07:Send_data(0x00);break;
default:break;
}
delay(10);
Send_data(0xff);
}
}
}
/************************* 蜂鸣器模块 ************************************/
/*==================== 发声 ====================*/
void play(uchar del)
{
uchar t;
for(t=0;t<del;t++)
{ }
Speak=!Speak;
}
void Play_dingdong(void)
{
uint num;
for(num=0;num<3000;num++)
{
play(26);
}
for(num=0;num<2000;num++)
{
play(65);
}
}
/*******************************A/D,D/A转换模块*************************/
void DA_test(void) //向DAC0832写入正弦波数据 从ADC_in0C0809读出数据
{
uchar i,tmp;
for(i=0;i<24;i++)
{ tmp=tab_dac[i];
DA=tmp;
i++;
delay(500);
}
}
void AD_test(void) //向DAC0832写入正弦波数据 从ADC_in0C0809读出数据
{
uchar ad_result;
uchar i;
uint time,ad_int;
uchar tab_dac_dat[5];
ADC_in0=0; //启动ADC_in0_IN0
while(1) //等待 ADC 转换结束
{
if(ADC_EOC) break;
else time++;
if(time==40000)
{
LCD_WriteCmd(0x01); //清屏
delay(10);
LCD_WriteStr("出错",2); //液晶屏模块
return;
}
}
ad_result=ADC_in0;
ad_int=(uint)(ad_result*19);
for(i=0;i<4;i++)
{
tab_dac_dat[4-i]=ad_int%10+'0';
ad_int=ad_int/10;
}
tab_dac_dat[0]=tab_dac_dat[1];
tab_dac_dat[1]='.';
// LCD_WriteCmd(0x01); //清屏
// delay(10);
LCD_WriteCmd(0x80);
for (i=0;i<5;i++)
{
LCD_WriteDat(tab_dac_dat[i]);
delay(50);
}
return;
}
/*==========================外部中断0(菜单键)==========================*/
void int1(void) interrupt 2 //菜单键
{
//
delay(500);
switch(sys_state)
{
case 1:
LCD_WriteCmd(0x01); //清屏
delay(10);
LCD_WriteCmd(0x80); //写入显示的地址
LCD_WriteStr("液晶屏模块",5); //液晶屏模块
LCD_WriteCmd(0x87);
LCD_WriteDat(0xa1); //<-
LCD_WriteDat(0xfb);
LCD_WriteCmd(0x90); //写入显示的地址
LCD_WriteStr("键盘模块",4); //键盘模块
sys_state=2;
key_state=1; //等待确认
break ;
case 2:
LCD_WriteCmd(0x01); //清屏
delay(10);
LCD_WriteCmd(0x80); //写入显示的地址
LCD_WriteStr("键盘模块",4); //键盘模块
LCD_WriteCmd(0x87);
LCD_WriteDat(0xa1); //<-
LCD_WriteDat(0xfb);
LCD_WriteCmd(0x90); //写入显示的地址
LCD_WriteDat('A'); //A/D,D/A转换
LCD_WriteDat(0x2f);
LCD_WriteDat('D');
LCD_WriteDat(',');
LCD_WriteDat(' ');
LCD_WriteDat('D');
LCD_WriteDat(0x2f);
LCD_WriteDat('A');
LCD_WriteStr("转换",2);
sys_state=3;
key_state=1; //等待确认
break;
case 3:
LCD_WriteCmd(0x01); //清屏
delay(10);
LCD_WriteCmd(0x80); //写入显示的地址
LCD_WriteDat('A');
LCD_WriteDat(0x2f); //A/D,D/A转换
LCD_WriteDat('D');
LCD_WriteDat(',');
LCD_WriteDat(' ');
LCD_WriteDat('D');
LCD_WriteDat(0x2f);
LCD_WriteDat('A');
LCD_WriteStr("转换",2);
LCD_WriteCmd(0x87);
LCD_WriteDat(0xa1); //<-
LCD_WriteDat(0xfb);
LCD_WriteCmd(0x90);
LCD_WriteStr("步进电机模块",6); //步进电机模块
sys_state=4;
key_state=1; //等待确认
break;
case 4:
LCD_WriteCmd(0x01); //清屏
delay(10);
LCD_WriteCmd(0x80);
LCD_WriteStr("步进电机模块",6); //步进电机模块
LCD_WriteCmd(0x87);
LCD_WriteDat(0xa1); //<-
LCD_WriteDat(0xfb);
LCD_WriteCmd(0x90);
LCD_WriteStr("扬声器",3);
sys_state=5;
key_state=1; //等待确认
break;
case 5:
LCD_WriteCmd(0x01); //清屏
delay(10);
LCD_WriteCmd(0x80);
LCD_WriteStr("扬声器",3);
LCD_WriteCmd(0x87);
LCD_WriteDat(0xa1); //<-
LCD_WriteDat(0xfb);
LCD_WriteCmd(0x90); //写入显示的地址
LCD_WriteStr("点阵模块",4); //液晶屏模块
sys_state=6;
key_state=1; //等待确认
break;
case 6:
LCD_WriteCmd(0x01); //清屏
delay(10);
LCD_WriteCmd(0x80);
LCD_WriteStr("点阵模块",4);
LCD_WriteCmd(0x87);
LCD_WriteDat(0xa1); //<-
LCD_WriteDat(0xfb);
LCD_WriteCmd(0x90); //写入显示的地址
LCD_WriteStr("液晶屏模块",5); //液晶屏模块
sys_state=1;
key_state=1; //等待确认
break;
default:break ;
}
}
/*=====================================================================*/
/*===========================外部中断1(确认键)=========================*/
void int0(void) interrupt 0 //确认键
{
uchar tmp;
bit flag;
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -