📄 key.c
字号:
#include "iom16v.h"
#include "macros.h"
#include "eeprom.h"
#define uchar unsigned char
#define uint unsigned int
#define LCD_DAT PORTA
#define SET_RS PORTB|=0x01
#define CLR_RS PORTB&=0xFE
#define SET_EN PORTB|=0x02
#define CLR_EN PORTB&=0xFD
#define LCD_DATA_EN PORTD&=0XFC
const uchar tab1[]="MCU";
const uchar tab2[]="FPGA";
const uchar tab3[]="(download)";
uchar tab[]={0x30,0x31,0x32,0x33,0x34,0x35,0x36,0x37,0x38,0x39};
void delay_1us(void);
void delay_us(uint n);
void delay_1ms(void);
void delay_ms(uint n);
void port_init(void);
void init_lcd(void);
void new_display(void);
void wc(uchar Lcdcommand);//写LCD指令
void wd(uchar Lcddate);//写LCD数据
void wnum(uchar date,uchar location);
void sel_key(void);
void down_key(void);
void mcu_down(void);
void fpga_down(void);
uchar mcu_value;
uchar fpga_value;
uchar key_value;
uchar key_num=0;
uchar key_flag=0;
void main(void)
{
//EEPROMwrite(0x20,18);
//EEPROMwrite(0x30,18);
mcu_value=EEPROMread(0x20);
fpga_value=EEPROMread(0x30);
//uchar key_value;
delay_ms(100);//等待100ms使电压稳定
CLI(); //disable all interrupts
port_init();
MCUCR = 0x00;
GICR = 0x00;
TIMSK = 0x00; //timer interrupt sources
SEI();
init_lcd();
delay_ms(10);
new_display();
while(1)
{
key_value=PIND&0xc0;
if(key_value!=0xc0)
{
delay_ms(15);
key_value=PIND&0xc0;
if(key_value!=0xc0)
{
while((PIND&0xc0)!=0xc0);//等待按键松开
switch(key_value)
{
case 0x80:key_num++;sel_key();break;
case 0x40:down_key();break;
default:break;
}
}
}
}
}
void port_init(void)
{
PORTA = 0x00;
DDRA = 0xFF;
PORTB = 0x00;
DDRB = 0x0B;
PORTC = 0x00; //m103 output only
DDRC = 0x40;
PORTD = 0x00;
DDRD = 0X00;
}
void init_lcd(void)
{
wc(0x01); //清屏
wc(0x38); //8位数据传送,两行显示,5*7
wc(0x03); //输入模式设置
wc(0x0c); //开显示,关光标
delay_ms(50);
}
void new_display(void)
{
uchar n;
wc(0x80);
for(n=0;n<3;n++)
{
wd(tab1[n]);
}
wnum(mcu_value,0x8e);
wc(0xc0);
for(n=0;n<4;n++)
{
wd(tab2[n]);
}
wnum(fpga_value,0xce);
}
void wc(uchar Lcdcommand)
{
CLR_RS; //select LCD command register
SET_EN; //when EN derises,output the command
LCD_DATA_EN;
delay_us(5);
LCD_DAT=Lcdcommand;
delay_us(5);
CLR_EN;
delay_us(5);
}
void wd(uchar Lcddate)
{
SET_RS; //select LCD data register
SET_EN; //when EN derises,output the data
LCD_DATA_EN;
delay_us(5);
LCD_DAT=Lcddate; //LCD data
delay_us(5);
CLR_EN;
delay_us(5);
}
void wnum(uchar date,uchar location)
{
uchar temp0,temp1;
temp0=date/10;
temp1=date%10;
wc(location);
wd(tab[temp0]);
wd(tab[temp1]);
}
void sel_key(void)
{
uchar i;
switch(key_num)
{case 1:
{
key_flag=1;
wc(0x01);
delay_1ms();
new_display();
wc(0x84);
for(i=0;i<10;i++)
wd(tab3[i]);
break;
}
case 2:
{
key_flag=2;
wc(0x01);
delay_1ms();
new_display();
wc(0xc4);
for(i=0;i<10;i++)
wd(tab3[i]);
key_num=0;
break;
}
default:break;
}
}
void down_key(void)
{
switch(key_flag)
{
case 1:{
switch(mcu_value)
{
case 0:
{
mcu_value=18;
wnum(mcu_value,0x8e);
break;
}
default:
{
mcu_value--;
EEPROMwrite(0x20,mcu_value);
wnum(mcu_value,0x8e);
break;
}
}
}
delay_ms(50);
mcu_down();
key_flag=0;
key_num=0;
break;
case 2:{
switch(fpga_value)
{
case 0:fpga_value=18;wnum(fpga_value,0xce);break;
default:fpga_value--;EEPROMwrite(0x30,fpga_value);wnum(fpga_value,0xce);break;
}
}
delay_ms(50);
fpga_down();
key_flag=0;
key_num=0;
break;
default:break;
}
}
void mcu_down(void)
{
uchar i;
wc(0x01);
new_display();
wc(0x83);
for(i=0;i<11;i++)//例子效果,使用真正的下载程序代替
{
wd(0x2e);
delay_ms(100);
}
wc(0x01);
new_display();
wc(0x86);
wd('D');
wd('O');
wd('N');
wd('E');
wd('!');
delay_ms(500);
wc(0x01);
new_display();
}
void fpga_down(void)
{
uchar i;
wc(0x01);
new_display();
wc(0xc4);
for(i=0;i<10;i++)//例子效果,使用真正的下载程序代替
{
wd(0x2e);
delay_ms(100);
}
wc(0x01);
new_display();
wc(0xc6);
wd('D');
wd('O');
wd('N');
wd('E');
wd('!');
delay_ms(500);
wc(0x01);
new_display();
}
//1us延时函数
void delay_1us(void)
{
asm("nop");
}
//nus延时函数
void delay_us(uint n)
{
uint i=0;
for(i=0;i<n;i++)
delay_1us();
}
//1ms延时函数
void delay_1ms(void)
{
uint i;
for(i=0;i<1000;i++)
delay_1us();
}
//nms延时函数
void delay_ms(uint n)
{
uint i;
for(i=0;i<n;i++)
delay_1ms();
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -