?? 1.txt
字號:
/*********************************************************************************************
* File: 8led.c
* Author: embest
* Desc: 8-segment digit LED control functions
* History:
*********************************************************************************************/
#include "44b.h"
#include "44blib.h"
#include "def.h"
#include "iic.h"
/*------------------------------------------------------------------------------------------*/
/* global variables */
/*------------------------------------------------------------------------------------------*/
int f_nKeyPress;
/*------------------------------------------------------------------------------------------*/
/* function declare */
/*------------------------------------------------------------------------------------------*/
void keyboard_test(void);
void keyboard_int(void);
UINT8T key_set(UINT8T ucChar);
void display_led(int s);
void led_test();
void clear_led();
void showerror();
void showoperator(UINT8T ucChar);
void ShowRolling(int temp3);
/*------------------------------------------------------------------------------------------*/
/* global variables */
/*------------------------------------------------------------------------------------------*/
/*
__7___
| |
2| |6
|--1---|
3| |5
|__4___|.0
data [7 6 5 4 3 2 1 0]
*/
unsigned char f_szDigital[] ={0xFC,0x60,0xDA,0xF2,0x66,0xB6,0xBE,0xE0,0xFE,0xF6};// 0 ~ 9
/*------------------------------------------------------------------------------------------*/
/*------------------------------------------------------------------------------------------*/
/*display_led函數用于在數碼管上顯示數字s,如果flg=0,則在L1上顯示;如果flg=1,則在L2上顯示;*/
void display_led(int s)
{
int i;
int j,k;
k=s;
clear_led();
if(s==0)
{
iic_write(0x70, 0x14, f_szDigital[0]);
return;
}
for(i=0; i<8; i++)
{
j=k%10;
if(k!=0&&i<4)
iic_write(0x70, 0x14+i, f_szDigital[j]);
else if(k!=0&&i>=4)
iic_write(0x70, 0x10+i-4, f_szDigital[j]);
else if(k==0&&i<4)
iic_write(0x70, 0x14+i, 0);
else if(k==0&&i>=4)
iic_write(0x70, 0x10+i-4, 0);
k/=10;
}
}
void clear_led()
{
int i;
for(i=0; i<8; i++)
iic_write(0x70, 0x10+i, 0);
}
void showerror()
{
int i=0;
clear_led();
unsigned char error[]={0x9E,0xEE,0xEE,0xFC,0xEE};
iic_write(0x70, 0x10,error[0]);
iic_write(0x70, 0x17,error[1]);
iic_write(0x70, 0x16,error[2]);
iic_write(0x70, 0x15,error[3]);
iic_write(0x70, 0x14,error[4]);
}
void showoperator(UINT8T ucChar)
{
clear_led();
unsigned char add[]={0xEE,0xFC,0xFC};
unsigned char sub[]={0xB6,0x7C,0xFE};
unsigned char che[]={0x9C,0x6E,0x9E};
switch(ucChar)
{
case '+':
iic_write(0x70, 0x16, add[0]);
iic_write(0x70, 0x15, add[1]);
iic_write(0x70, 0x14, add[2]);
uart_printf("+\n");
break;
case '-':
iic_write(0x70, 0x16, sub[0]);
iic_write(0x70, 0x15, sub[1]);
iic_write(0x70, 0x14, sub[2]);
break;
case '*':
iic_write(0x70, 0x16, che[0]);
iic_write(0x70, 0x15, che[1]);
iic_write(0x70, 0x14, che[2]);
break;
}
}
void ShowRolling(int temp3)
{
int rolling[20];
int len=1;
int i;
int j;
while(temp3!=0)
{
rolling[19-len++]=temp3%10;
temp3/=10;
}
for(i=0;i<=19-len;i++)
rolling[i]=-1;
i=0;
while(i<len)
{
for(j=0;j<4;j++)
{
if(rolling[i+8-j]<0)
iic_write(0x70, 0x14+j,0);
else
iic_write(0x70, 0x14+j,f_szDigital[rolling[i+8-j]]);
}
for(;j<8;j++)
{
if(rolling[i+8-j]<0)
iic_write(0x70, 0x10+j-4,0);
else
iic_write(0x70, 0x10+j-4,f_szDigital[rolling[i+8-j]]);
}
delay(6000);
i++;
}
}
/*********************************************************************************************
* name: keyboard_test
* func: test 8led
* para: none
* ret: none
* modify:
* comment:
********************************************************************************************/
void keyboard_test(void)
{
int i, j, k;
UINT8T ucChar, t;
int temp1,temp2,temp3,RollingNum;
int oper;
iic_init();
// set EINT2 interrupt handler
pISR_EINT2 = (int)keyboard_int;
clear_led();
l1: while(1)
{
temp1=0;
temp2=0;
temp3=0;
//首先等待輸入第一個數
while(1)
{
ucChar=0;
while(ucChar==0)
{
f_nKeyPress = 0;
rINTMSK = rINTMSK & (~(BIT_GLOBAL|BIT_EINT2)); // enable EINT2 int
while(f_nKeyPress == 0);
iic_read(0x70, 0x1, &ucChar);
}
if(ucChar !=0)
{
ucChar = key_set(ucChar);
if(ucChar < 10)
{
temp1=temp1*10;
temp1+=ucChar;
display_led((temp1%100000000));
}
else if(ucChar == '+'|ucChar=='-'|ucChar=='*')
{
oper=ucChar;
showoperator(ucChar);
break;
}
}
}
//然后等待輸入第二個運算數
while(1)
{
ucChar=0;
while(ucChar==0)
{
f_nKeyPress = 0;
rINTMSK = rINTMSK & (~(BIT_GLOBAL|BIT_EINT2)); // enable EINT2 int
while(f_nKeyPress == 0);
iic_read(0x70, 0x1, &ucChar);
}
if(ucChar !=0)
{
ucChar = key_set(ucChar);
if(ucChar < 10)
{
temp2=temp2*10;
temp2+=ucChar;
display_led(temp2%100000000);
}
else if(ucChar == 0xFF)
{
switch(oper)
{
case '+':
temp3=temp1+temp2;
break;
case '-':
temp3=temp1-temp2;
break;
case '*':
temp3=temp1*temp2;
break;
}
if(temp3<100000000)
{
display_led(temp3%100000000);
}
else
{
ShowRolling(temp3);
}
break;
}
else
{
showerror();
goto l1;
break;
}
}
}
}
}
/*********************************************************************************************
* name: keyboard_int
* func: keyboard interrupt handler
* para: none
* ret: none
* modify:
* comment:
********************************************************************************************/
void keyboard_int(void)
{
UINT8T ucChar;
delay(1000);
rINTMSK = rINTMSK | BIT_EINT2; // disable EINT2 int
rI_ISPC = BIT_EINT2;
f_nKeyPress = 1;
}
/*********************************************************************************************
* name: key_set
* func: keyboard setting
* para: none
* ret: none
* modify:
* comment:
*********************************************************************************************/
UINT8T key_set(UINT8T ucChar)
{
switch(ucChar)
{
case 1:
case 2:
case 3:
case 4:
case 5:
ucChar-=1; break;
case 9:
case 10:
case 11:
case 12:
case 13:
ucChar-=4; break;
case 17:
case 18:
case 19:
case 20:
case 21:
ucChar-=7; break;
case 25: ucChar = 0xF; break;
case 26: ucChar = '+'; break;
case 27: ucChar = '-'; break;
case 28: ucChar = '*'; break;
case 29: ucChar = 0xFF; break;
default: ucChar = 0xFE;
}
return ucChar;
}
?? 快捷鍵說明
復制代碼
Ctrl + C
搜索代碼
Ctrl + F
全屏模式
F11
切換主題
Ctrl + Shift + D
顯示快捷鍵
?
增大字號
Ctrl + =
減小字號
Ctrl + -