📄 yijia.c
字号:
}
s=0;
}
/*擦除操作,ax:地址*/
void erase93(U8 ax)
{
char i;
/* 前导条件 */
c=0;
d=0;
s=0;
s=1;
d=1;
c=0;
c=1;
/* 发送操作码 */
d=1;
c=0;
c=1;
c=0;
c=1;
/* 发送地址 */
for(i=5;i>=0;i--)
{
d=(ax>>i) & 1;
c=0;
c=1;
}
/*启动擦除操作*/
s=0;
s=1;
/*等待擦除操作结束*/
while(q==0);
/* delay();
delay(); */
s=0;
}
/*擦除全部操作*/
void eraseall93(void)
{
char i;
/* 前导条件 */
c=0;
d=0;
s=0;
s=1;
d=1;
c=0;
c=1;
/* 发送操作码 */
d=0;
c=0;
c=1;
c=0;
c=1;
d=1;
c=0;
c=1;
/* 发送地址 */
for(i=4;i>=0;i--)
{
d=0;
c=0;
c=1;
}
/*启动擦除操作*/
s=0;
s=1;
/*等待擦除操作结束*/
while(q==0);
/* delay();
delay(); */
s=0;
}
/*写全部操作*/
void writeall93(U16 dx)
{
char i;
eraseall93();
/* 前导条件 */
c=0;
d=0;
s=0;
s=1;
d=1;
c=0;
c=1;
/* 发送操作码 */
d=0;
c=0;
c=1;
c=0;
c=1;
c=0;
c=1;
/* 发送地址 */
for(i=4;i>=0;i--)
{
d=1;
c=0;
c=1;
}
/* 发送数据 */
for(i=15;i>=0;i--)
{
d=(dx>>i) & 1;
c=0;
c=1;
}
/*启动写操作*/
s=0;
s=1;
/*等待写操作结束*/
while(q==0);
/* delay();
delay(); */
s=0;
}
/*
void Ewen(void) {
unsigned char temp,InData;
CS=0;
SK=0;
CS=1;
InData=0x98; // 10011XXXX
for(temp=9;temp!=0;temp--) { // 9
DI=InData&0x80;
SK=1; SK=0;
InData<<=1;
}
CS=0;
}
// Disables all programming instructions.
void Ewds(void) {
unsigned char temp,InData;
CS=0;
SK=0;
CS=1;
InData=0x80; // 10000XXXX
for(temp=9;temp!=0;temp--) { // 9
DI=InData&0x80;
SK=1; SK=0;
InData<<=1;
}
CS=0;
}
// Reads data stored in memory, at specified address.
unsigned int Read(unsigned char address) {
unsigned char temp;
unsigned int result;
Ewen();
SK=0; DI=1; // 110 A5-A0
CS=0; CS=1;
SK=1; SK=0; // 1
address=address&0x3f|0x80;
for(temp=8;temp!=0;temp--) { // 8
DI=address&0x80;
SK=1; SK=0;
address<<=1;
}
DO=1;
for(temp=16;temp!=0;temp--) { // 16
SK=1;
result=(result<<1)|DO;
SK=0;
}
CS=0;
Ewds();
return(result);
}
// Writes memory location An - A0.
void Write(unsigned char address,unsigned int InData) {
unsigned char temp;
Ewen();
SK=0; DI=1; // 101 A5-A0
CS=0; CS=1;
SK=1; SK=0; // 1
address=address&0x3f|0x40;
for(temp=8;temp!=0;temp--) { // 8
DI=address&0x80;
SK=1; SK=0;
address<<=1;
}
for(temp=16;temp!=0;temp--) { // 16
DI=InData&0x8000;
SK=1; SK=0;
InData<<=1;
}
CS=0; DO=1;
CS=1; SK=1;
while(DO==0) { // busy test
SK=0; SK=1;
}
SK=0; CS=0;
Ewds();
}
/*
// Erase memory location An - A0.
void Erase(unsigned char address) {
unsigned char temp;
Ewen();
SK=0; DI=1; // 111 A5-A0
CS=0; CS=1;
SK=1; SK=0; // 1
address|=0xc0;
for(temp=8;temp!=0;temp--) { // 8
DI=address&0x80;
SK=1; SK=0;
address<<=1;
}
CS=0; DO=1;
CS=1; SK=1;
while(DO==0) {
SK=0; SK=1;
}
SK=0; CS=0;
Ewds();
}
// Erases all memory locations. Valid only at VCC = 4.5V to 5.5V.
void Eral(void) {
unsigned char temp,InData;
Ewen();
CS=0;
SK=0;
CS=1;
InData=0x90; // 10010XXXX
for(temp=9;temp!=0;temp--) { // 9
DI=InData&0x80;
SK=1; SK=0;
InData<<=1;
}
CS=0; DO=1;
CS=1; SK=1;
while(DO==0) {
SK=0; SK=1;
}
SK=0; CS=0;
Ewds();
}
// Writes all memory locations. Valid only at VCC = 4.5V to 5.5V.
void Wral(unsigned int InData) {
unsigned char temp,address;
Ewen();
CS=0;
SK=0;
CS=1;
address=0x88; // 10001XXXX
for(temp=9;temp!=0;temp--) { // 9
DI=address&0x80;
SK=1; SK=0;
address<<=1;
}
for(temp=16;temp!=0;temp--) { // 16
DI=InData&0x8000;
SK=1; SK=0;
InData<<=1;
}
CS=0; DO=1;
CS=1; SK=1;
while(DO==0) {
SK=0; SK=1;
}
SK=0; CS=0;
Ewds();
}
/*初始化子程序 */
void ch451_init()
{
ch451_din=0; /*先低后高,选择4线输入 */
ch451_din=1;
ch451_write(CH451_SYSON2); /*设定系统参数:010000000[wdog][keyb][disp]B关看门狗、键盘扫描使能、显示驱动使能 */
ch451_write(CH451_USER); /*设定显示参数:0101[mode][limit,3bits][intensity,4bits]B, BCD译码、扫描极限为4、显示亮度为最亮*/
#ifdef USE_KEY
IT1=0; /*设置下降沿触发 */
IE1=0; /*清中断标志 */
PX1=0; /*设置低优先级 */
EX1=1; /*开中断 */
#endif
}
/****************************************************** */
/*输出命令子程序
定义一无符号整型变量存储12字节的命令字。 */
void ch451_write(U16 command)
{
U8 i;
#ifdef USE_KEY
EX1=0; /*禁止键盘中断 */
#endif
ch451_load=0; /*命令开始 */
for(i=0;i<12;i++){ /*送入12位数据,低位在前 */
ch451_din=command&1;
ch451_dclk=0;
command>>=1;
ch451_dclk=1; /*上升沿有效 */
}
ch451_load=1; /*加载数据 */
#ifdef USE_KEY
EX1=1;
#endif
}
#ifdef USE_KEY
/************************************************** /
/*输入命令子程序,MCU从451读一字节 */
U8 ch451_read()
{
U8 i;
U8 command,keycode; /*定义命令字,和数据存储器 */
EX1=0; /*关中段 */
command=0x07; /*输入读451命令字 */
ch451_load=0;
for(i=0;i<4;i++){
ch451_din=command&1; /*送入最低位 */
ch451_dclk=0;
command>>=1; /*往右移一位 */
ch451_dclk=1; /*产生时钟上升沿锁通知CH451输入位数据*/
}
ch451_load=1; /*产生加载上升沿通知CH451处理命令数据 */
keycode=0; /*清除keycode */
for(i=0;i<7;i++){
keycode<<=1; /*数据移入keycode,高位在前,低位在后 */
keycode|=ch451_dout; /*从高到低读入451的数据 */
ch451_dclk=0; /*产生时钟下升沿通知CH451输出下一位*/
ch451_dclk=1;
}
IE1=0; /*清中断标志 */
EX1=1;
return(keycode); /*反回键值 */
}
/************************************************** */
/*中断子程序 使用中断2,寄存器组2 */
void ch451_inter() interrupt 2 using 2
{
U8 i; /*定义循环变量 */
U8 command,keycode; /*定义控制字寄存器,和中间变量定时器 */
command=0x07; /*读取键值命令的高4位0111B * /
ch451_load=0; /*命令开始 */
for(i=0;i<4;i++){
ch451_din=command&1; /*低位在前,高位在后 * /
ch451_dclk=0;
command>>=1; /*右移一位 */
ch451_dclk=1; /*产生时钟上升沿锁通知CH451输入位数据 */
}
ch451_load=1; /*产生加载上升沿通知CH451处理命令数据 */
keycode=0; /*清除keycode */
for(i=0;i<7;i++){
keycode<<=1; /*数据作移一位,高位在前,低位在后*/
keycode|=ch451_dout; /*从高到低读入451的数据 */
ch451_dclk=0; /*产生时钟下升沿通知CH451输出下一位 */
ch451_dclk=1;
}
ch451_key=keycode; /*保存上次的键值 */
IE1=0; /*清中断标志 */
kf=1;
}
/************************************************/
#endif
/*************************************************/
/*延时程序 */
void delay(){ /*在12P下延时十毫秒*/
U8 i,j,k;
for(i=0;i<10;i++)
for(j=0;j<40;j++)
for(k=0;k<120;k++);
}
/************************************************/
/*void main(){
uchar a,b,c,d;
d=0;
ch451_init(); //调用初始化
ch451_write(0x403);
ch451_write(0x580); //测试送入命令
ch451_write(CH451_DIG0|0X01); //最低位显示1
EA=1;
ch451_key=0x0ff;
while(1){
while(ch451_key==0xff); //等待中断
a=ch451_key;
d=a;
ch451_key=0x0ff;
ch451_write(0x300); //左移两位
ch451_write(0x300);
a&=0x3f; //显示十进制数据
b=a;
a/=10;
ch451_write(CH451_DIG1|a);
b%=10;
ch451_write(CH451_DIG0|b);
delay();
c=ch451_read();
while(c==d) //测试按键是否释放
{
ch451_write(CH451_DIG0|b|0x80);
delay();
c=ch451_read();
}
ch451_write(CH451_DIG0|b);
}
} */
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -