?? ch452.c
字號:
/*******************************************************************************
* 標題: 藍海微芯LJD-SY-5200單片機開發系統演示程序 *
* 文件: CH451_INT1.C *
* 日期: 2006-8-11 *
* 版本: 1.0 *
* 作者: 藍海微芯 *
* 網站: http://www.ljd-2008.com *
********************************************************************************
* 描述: *
* 在數碼管上顯示按鍵值 *
* *
* *
********************************************************************************
* 【版權】 Copyright(C)微芯科技 http://www.bluemcu.com All Rights Reserved *
* 【聲明】 此程序僅用于學習與參考,引用請注明版權和作者信息! *
*******************************************************************************/
#include<reg52.h>
#include<absacc.h>
#include<intrins.h>
#define uchar unsigned char
#define uint unsigned int
#define CH451_DIG0 0x0800 /*數碼管位0顯示*/
#define CH451_DIG1 0x0900 /*數碼管位1顯示*/
#define CH451_DIG2 0x0a00 /*數碼管位2顯示*/
#define CH451_DIG3 0x0b00 /*數碼管位3顯示*/
#define CH451_DIG4 0x0c00 /*數碼管位4顯示*/
#define CH451_DIG5 0x0d00 /*數碼管位5顯示*/
#define CH451_DIG6 0x0e00 /*數碼管位6顯示*/
#define CH451_DIG7 0x0f00 /*數碼管位7顯示*/
sbit ch451_din = P1^6;
sbit ch451_clk = P1^5;
sbit ch451_load = P1^7;
sbit ch451_dout = P3^2;
volatile uchar ch451_key;
volatile uchar M;
volatile uchar N;
volatile bit flag;
/********************************************************************
函 數 名:ch451_init()
功 能:對ch451芯片進行初始化
說 明:
調 用:
入口參數:
返 回 值:
設 計:藍海微芯
***********************************************************************/
void ch451_init(void)
{
ch451_din = 0; /*先低后高,選擇4線輸入*/
ch451_din = 1;
ch451_load = 1;
ch451_clk = 1;
_nop_();
}
/********************************************************************
函 數 名:ch451_write()
功 能:把12位的指令或數據寫入ch451
說 明:12位數據或指令的寫入順序是低位
調 用:
入口參數:command
返 回 值:
設 計:藍海微芯
***********************************************************************/
void ch451_write(unsigned int command)
{
unsigned char i;
#ifdef USE_KEY
EX0=0; /*禁止鍵盤中斷*/
#endif
ch451_load=0; /*命令開始*/
for(i=0;i<12;i++)
ch451_din=command&1;
ch451_clk=0;
command>>=1;
ch451_clk=1; /*上升沿有效*/
}
ch451_load=1; /*加載數據*/
#ifdef USE_KEY
EX0=1;
#endif
}
/********************************************************************
函 數 名:ch451_bcd()
功 能:對按鍵值進行分離
說 明:把一字節按鍵值分拆分成兩字節
調 用:
入口參數:ds_bcd
返 回 值:
設 計:藍海微芯
***********************************************************************/
void ch451_bcd(uchar ds_bcd)
{
switch(ds_bcd)
{
case 0x44: M=0x00; break; /*按鍵0被按下*/
case 0x45: M=0x01; break; /*按鍵1被按下*/
case 0x46: M=0x02; break; /*按鍵2被按下*/
case 0x47: M=0x03; break; /*按鍵3被按下*/
case 0x4C: M=0x04; break; /*按鍵4被按下*/
case 0x4D: M=0x05; break; /*按鍵5被按下*/
case 0x4E: M=0x06; break; /*按鍵6被按下*/
case 0x4F: M=0x07; break; /*按鍵7被按下*/
case 0x54: M=0x08; break; /*按鍵8被按下*/
case 0x55: M=0x09; break; /*按鍵9被按下*/
default:return;
}
// M = ds_bcd&0xf0;
//M>>=4;
// N = ds_bcd&0x0f;
}
/********************************************************************
函 數 名:ch451中斷服務程序
功 能:獲取鍵值
說 明:
調 用:
入口參數:
返 回 值:ch451_key
設 計:藍海微芯
***********************************************************************/
void ch451_inter() interrupt 1 using 1
{
unsigned char i; /*定義循環變量*/
unsigned char command,keycode; /*定義控制字寄存器,和中間變量定時器*/
command=0x07; /*讀取鍵值命令的高4位0111B*/
EX0= 0;
ch451_load=0; /*命令開始*/
for(i=0;i<4;i++)
{
ch451_din=command&1; /*低位在前,高位在后*/
ch451_clk=0;
command>>=1; /*右移一位*/
ch451_clk=1; /*產生時鐘上升沿鎖通知CH451輸入位數據*/
}
ch451_load=1; /*產生加載上升沿通知CH451處理命令數據*/
keycode=0; /*清除keycode*/
for(i=0;i<7;i++)
{
keycode<<=1; /*數據作移一位,高位在前,低位在后*/
keycode|=ch451_dout; /*從高到低讀入451的數據*/
ch451_clk=0; /*產生時鐘下升沿通知CH451輸出下一位*/
ch451_clk=1;
}
ch451_key=keycode; /*保存上次的鍵值*/
flag=1;
EX0 = 1;
IE0=0; /*清中斷標志*/
}
main()
{
EA=1;
EX0=1;
flag=0;
ch451_init();
ch451_write(0x403);
ch451_write(0x580);
ch451_write(CH451_DIG7|M);
//ch451_write(CH451_DIG6|N);
while(1)
{
if(flag)
{
flag=0;
ch451_bcd(ch451_key);
ch451_write(CH451_DIG7|M);
//ch451_write(CH451_DIG6|N);
}
}
}
?? 快捷鍵說明
復制代碼
Ctrl + C
搜索代碼
Ctrl + F
全屏模式
F11
切換主題
Ctrl + Shift + D
顯示快捷鍵
?
增大字號
Ctrl + =
減小字號
Ctrl + -