|
#include <STC12C5A60S2.H>
#include "intrins.h" //包含nop指令頭文件
#define nop _nop_();_nop_();_nop_();_nop_();_nop_();_nop_();//宏定義
/********************定義控制端口**********************/
sbit DIO=P1^2; //定義DIO
sbit CLK=P1^1; //定義CLK
sbit STB=P1^0; //定義STB
//sbit stb =P1^0; //定義片選通訊口
//sbit clk =P1^1; //定義時(shí)鐘通訊口
//sbit dio =P1^2; //定義數(shù)據(jù)輸入/輸出通訊口
/********************定義數(shù)據(jù)*************************/
unsigned char Key[4]={0}; //為存儲(chǔ)按鍵值定義的數(shù)組
//unsigned char const CODE[16]={0x3F,0x06,0x5B,0x4F,0x66,0x6D,0x7D,0x07,0x7F,0x6F,0x77,0x7C,0x39,0x5E,0x79,0x71,}; //共陰數(shù)碼管0~F字型碼,以實(shí)際電路接法為準(zhǔn)
unsigned char const CODE[16] = {0xC0,0xF9,0xA4,0xB0,0x99,0x92,0x82,0xF8,0x80,0x90,0x88,0x83,0xC6,0xA1,0x86,0x8E}; //0~F顯示代碼(共陽(yáng))
/***************延時(shí)函數(shù)**************/
void delay_nms(unsigned int n)
{
unsigned int i;
while(n--)
for(i=0;i<550;i++);
}
/***************發(fā)送8bit數(shù)據(jù),從低位開(kāi)始**************/
void send_8bit(unsigned char dat)
{
unsigned char i;
for(i=0;i<8;i++)
{
CLK=0;
if(dat&0x01)
DIO=1;
else
DIO=0;
_nop_();
_nop_();
_nop_();
CLK=1;
dat>>=1;
}
CLK=0;
DIO=0;
}
/******************發(fā)送控制命令***********************/
void send_command(unsigned char word)
{
STB=1;
nop;
STB=0;
send_8bit(word);
}
/****************讀取按鍵值并存儲(chǔ)*******************/
void read_key()
{
unsigned char i,j;
send_command(0x42);
DIO=1;
for(j=0;j<4;j++)
{
for(i=0;i<8;i++)
{
CLK=0;
Key[j]=Key[j]>>1;
CLK=1;
if(DIO)
Key[j]=Key[j]|0x80;
nop;
}
nop;
nop;
}
CLK=0;
DIO=0;
STB=1;
}
/************顯示函數(shù),數(shù)碼管1~16位顯示0~F************/
void display()
{
unsigned char i;
send_command(0x40); //設(shè)置數(shù)據(jù)命令:普通模式、地址自增1,寫(xiě)數(shù)據(jù)到顯存
send_command(0xc0); //設(shè)置顯示地址命令:從00H開(kāi)始
for(i=0;i<16;i++) //發(fā)送16字節(jié)的顯存數(shù)據(jù)
{
send_8bit(CODE[i]);
}
send_command(0x8C); //設(shè)置顯示控制命令:打開(kāi)顯示,并設(shè)置為11/16.
STB=1;
}
/************顯示函數(shù),第一位顯示按鍵值************/
void display0(unsigned char dat)
{
unsigned char i;
send_command(0x40); //設(shè)置數(shù)據(jù)命令:普通模式、地址自增1,寫(xiě)數(shù)據(jù)到顯存
send_command(0xc0); //設(shè)置顯示地址命令:從00H開(kāi)始
send_8bit(CODE[dat]); //第一位顯示數(shù)值
for(i=0;i<15;i++) //后15位不顯示
{
send_8bit(0x00);
}
send_command(0x8C); //設(shè)置顯示控制命令:打開(kāi)顯示,并設(shè)置為11/16.
STB=1;
}
/*****************按鍵處理函數(shù)*********************/
void key_process()
{
if(Key[0]!=0x00)
{
if((Key[0]==0x08)){display0(1);} //K0與SEG1按鍵按下,數(shù)碼管顯示數(shù)字1
if((Key[0]==0x04)){display0(2);} //K1與SEG1按鍵按下,數(shù)碼管顯示數(shù)字2
}
if(Key[1]!=0x00)
{
if((Key[1]==0x08)){display0(3);} //K0與SEG3按鍵按下,數(shù)碼管顯示數(shù)字3
if((Key[1]==0x04)){display0(4);} //K1與SEG3按鍵按下,數(shù)碼管顯示數(shù)字4
}
}
void main()
{
P1M1=0;
P1M0=0;
DIO=1; //定義DIO
CLK=1; //定義CLK
STB=1;
display(); //上電顯示0~F
delay_nms(10000);
while(1)
{
//read_key(); //讀按鍵值
////key_process(); //按鍵處理
//delay_nms(200); //延時(shí)200ms再讀按鍵
////display(); //上電顯示0~F
//display0(1);
display();
}
}
|
|