?? ch451.c
字號:
#define sbi(sfr, bit) (_SFR_BYTE(sfr) |= _BV(bit))
#define cbi(sfr, bit) (_SFR_BYTE(sfr) &= ~_BV(bit))
#include<util/delay.h>
#include<avr/interrupt.h>
#include"ch451.h"
void ch451_init(void);
void ch451_write(unsigned int command);
extern unsigned char ch451_key; //存放鍵盤中斷中讀取的鍵值
/*******************************************
主函數包含
DDRD=0xf7;
PORTD=0xff;
unsigned char ch451_key;
*******************************************/
/************初始化子程序*************/
void ch451_init()
{
ch451_din0; //先低后高,選擇4線輸入
_delay_us(10);
ch451_din1;
ch451_write(CH451_SYSON2); //開顯示、鍵盤
ch451_write(CH451_BCD|0x000);//設置BCD譯碼方式,中間是幾就是顯示幾位,若為0則全顯
}
/********CH451輸出命令子程序**********/
//定義一無符號整型變量存儲12字節的命令字。
void ch451_write(unsigned int command)
{
unsigned char i;
GICR=(0<<INT1);
ch451_load0; //命令開始
for(i=0;i<12;i++)
{ //送入12位數據,低位在前
if(command&1)
{ch451_din1;}
else
{ch451_din0;}
ch451_dclk0;
command>>=1;
ch451_dclk1; //上升沿有效
}
ch451_load1; //加載數據
GICR=(1<<INT1);
}
//*************************************************/
//輸入命令子程序,MCU從451讀一字節
unsigned char ch451_read(void)
{
unsigned char i;
unsigned char command,keycode; //定義命令字,和數據存儲器
GICR=(0<<INT1);
command=0x07; //輸入讀451命令字
ch451_load0;
for(i=0;i<4;i++)
{
if(command&1) //送入最低位
{ch451_din1;}
else
{ch451_din0;}
ch451_dclk0;
command>>=1; //往右移一位
ch451_dclk1; //產生時鐘上升沿鎖通知CH451輸入位數據
}
ch451_load1; //產生加載上升沿通知CH451處理命令數據
keycode=0; //清除keycode
for(i=0;i<7;i++)
{
keycode<<=1; //數據移入keycode,高位在前,低位在后
keycode|=ch451_dout; //從高到低讀入451的數據
ch451_dclk0; //產生時鐘下升沿通知CH451輸出下一位
ch451_dclk1;
}
GICR=(1<<INT1);
return(keycode); //反回鍵值 0~F
}
/**********按鍵中斷*************/
SIGNAL(SIG_INTERRUPT1)
{
unsigned char i;
unsigned char command,keycode; //定義命令字,和數據存儲器
GICR=(0<<INT1);
command=0x07; //輸入讀451命令字
ch451_load0;
for(i=0;i<4;i++)
{
if(command&1) //送入最低位
{ch451_din1;}
else
{ch451_din0;}
ch451_dclk0;
command>>=1; //往右移一位
ch451_dclk1; //產生時鐘上升沿鎖通知CH451輸入位數據
}
ch451_load1; //產生加載上升沿通知CH451處理命令數據
keycode=0; //清除keycode
for(i=0;i<7;i++)
{
keycode<<=1; //數據移入keycode,高位在前,低位在后
keycode|=ch451_dout; //從高到低讀入451的數據
ch451_dclk0; //產生時鐘下升沿通知CH451輸出下一位
ch451_dclk1;
}
ch451_key=keycode;
GICR=(1<<INT1);
}
?? 快捷鍵說明
復制代碼
Ctrl + C
搜索代碼
Ctrl + F
全屏模式
F11
切換主題
Ctrl + Shift + D
顯示快捷鍵
?
增大字號
Ctrl + =
減小字號
Ctrl + -