key_dis.c
来自「自己写的2262遥控解码程序」· C语言 代码 · 共 185 行
C
185 行
//define idle flag
#define LCD_busy 0X80
/********************************************************
* 函数说明:延时函数,ATMEGA8,内部2MHz,j<276时约1ms *
1MHz,j<135;4MHz,j<562
********************************************************/
void delay(uint ms)
{
uint i,j;
for(i=0;i<ms;i++)
{
for(j=0;j<562;j++);
}
}
/********************************************************
* 函数说明:延时函数,ATMEGA8,内部2MHz,j<5时约50us *
1MHz,j<2 ;4MHz,j<19
********************************************************/
void delay50(uint us)
{
uint i,j;
for(i=0;i<us;i++)
{
for(j=0;j<19;j++);
}
}
/********************************************************
* 函数说明:检测按键函数 *
* 返回值: 有键按下为1,无键按下为0 *
********************************************************/
uchar key_press()
{
uchar k;
//uchar sreg;
//sreg=(SREG&BIT(7)); //保存SREG bit 7
//SREG&=~(1<<7); //关闭CPU总中断请求
DDRC|=((1<<DDC0)|(1<<DDC1)); //key1:PC0;key2:PC1 00000011=0x03
PORTC|=((1<<PC0)|(1<<PC1));
DDRC&=~((1<<DDC0)|(1<<DDC1)); //11111100 PB2 PB4 输入
k=PINC;
k=k&((1<<DDC0)|(1<<DDC1));
if(k==0x03)
{
//SREG|=sreg; //恢复SREG bit 7
return 0;
}
else
{
//SREG|=sreg; //恢复SREG bit 7
return 1;
}
}
/********************************************************
* 函数说明:按键扫描函数 *
* 返回值: 1键按下为1,2键按下为2,其他为0 *
********************************************************/
uchar key_scan()
{
uchar key;
//sreg=(SREG&BIT(7)); //保存SREG bit 7
//SREG&=~(1<<7); //关闭CPU总中断请求
delay(10);
if(key_press())
{
key=PINC;
key=key&((1<<DDC0)|(1<<DDC1));
switch(key)
{
case 0x02:
key=1;
break;
case 0x01:
key=2;
break;
default:
key=0;
}
while(key_press());
}
else
{
key=0;
}
//SREG|=sreg; //恢复SREG bit 7
return key;
}
/********************************************************
* 函数说明:向1602发送指令 *
* 输入: 需要发送的指令 *
********************************************************/
void write_com(uchar com)
{
PORTC&=~(1<<PC5); //RS=0,command mode
PORTC&=~(1<<PC4); //R/W=0,write mode
PORTD=com;
PORTC|=(1<<PC3); //Enable LCD
delay(2);
PORTC&=~(1<<PC3); //disable LCD
}
/********************************************************
* 函数说明:向1602发送数据 *
* 输入: 需要发送的数据(一个字符) *
********************************************************/
void write_dat(uchar dat)
{
PORTC|=(1<<PC5); //RS=1,data mode
PORTC&=~(1<<PC4); //R/W=0,write mode
PORTD=dat;
PORTC|=(1<<PC3); //Enable LCD
delay(2);
PORTC&=~(1<<PC3); //disable LCD
}
/********************************************************
* 函数说明:等待1602空闲状态函数 *
********************************************************/
void wait1602ready()
{
PORTC|=(1<<PC4); //R/W=1,read mode
PORTC&=~(1<<PC5); //RS=0,command mode
PORTC|=(1<<PC3); //Enable LCD
PORTD=0xff;
DDRD=0x00;
//DelayUs(10);
while(!(PIND&LCD_busy)); //wait LCD idle
DDRD=0xff;
PORTC&=~(1<<PC3); //disable LCD
}
/********************************************************
* 函数说明:1602初始化函数 *
********************************************************/
void init_1602()
{
DDRD=0XFF;
DDRC|=(1<<PC3)|(1<<PC4)|(1<<PC5);
PORTC&=~(1<<PC3); //disable LCD
write_com(0X38); //display mode:16X2,5X7dot
wait1602ready();
write_com(0X01); //display clear
wait1602ready();
write_com(0X0C); //open dis,no cursor
wait1602ready();
write_com(0X06); //point+1,cursor+1 when read or write a char
wait1602ready();
}
/********************************************************
* 函数说明:显示一串字符 *
********************************************************/
void write_str(char *ucstr)
{
while(*ucstr)
{
write_dat(*ucstr);
ucstr++;
wait1602ready();
}
}
/********************************************************
* 函数说明:设置显示坐标函数 *
********************************************************/
void setxy_1602(uchar x,uchar y)
{
uchar addr;
if(y == 0)
addr = 0x80 + x;
else
addr = 0xc0 + x;
write_com(addr);
wait1602ready();
}
⌨️ 快捷键说明
复制代码Ctrl + C
搜索代码Ctrl + F
全屏模式F11
增大字号Ctrl + =
减小字号Ctrl + -
显示快捷键?