#define LEFTMASK "\x00\x80\xc0\xe0\xf0\xf8\xfc\xfe"
#define RIGHTMASK "\xff\x7f\x3f\x1f\x0f\x07\x03\x01"
#define R2MASK "\x7f\x3f\x1f\x0f\x07\x03\x01\x00"
#define L2MASK "\x80\xc0\xe0\xf0\xf8\xfc\xfe\xff"
#define FONT_FILE "/bin/hzk"
typedef struct{
unsigned char id[2];
long filesize;
short reserved[2];
long headsize;
long infosize;
long width;
long height;
short planes;
short bits;
long biCompression;
long sizeimage;
long biXpp;
long biYpp;
long biclrused;
long biclrimportant;
}BMPHEAD;
int lcd_setup(unsigned long start_addr, unsigned short width, unsigned short xmax, unsigned short ymax, unsigned short bits_per_pixel)
{
/* disable LCD first */
SYSCON1 &= ~0x00001000;
LCDCON = 0xE60f7c1f;
PALLSW = 0x76543210;
PALMSW = 0xFEDCBA98;
/* setup LCDFRAME */
FBADDR = 0x0000000C;
/* Enable LCD */
SYSCON1 |= 0x00001000;
return 0;
}
int _lcd_vline(
unsigned char *fbuf,
int x,
int y,
int y1,
int color,
int xorm
)
{
unsigned char *p;
int tmp;
if (y1 < y){
tmp = y;
y = y1;
y1 = tmp;
}
p = fbuf + x * 12 / 8 + y * (320 * 3 * 4 / 8);
for (; y <= y1; y++){
if(x&1)
{
*p&=0x0f;
//*p|=0x70;
*(p+1)&=0x07;
}
else
{
*p=0x70;
*(p+1)&=0xf0;
*(p+1)|=0xf7;
}
p += (320 * 3 * 4 / 8);
}
// return 0;
}
int lcd_vline(
short x,
short y1,
short y2,
unsigned char c,
int xorm
)
{
return _lcd_vline(
(unsigned char*)0xc0000000,
x,
y1,
y2,
c,
xorm
);
}
int _lcd_fillrect(
unsigned char *fbuf,
int x,
int y,
int x1,
int y1,
int color
)
{
// unsigned char *dst;
int xt, xf; //xmf, xmt;
// int xi;
int tmp, w, h;
if (x1 < x){
tmp = x;
x = x1;
x1 = tmp;
}
if (y1 < y){
tmp = y;
y = y1;
y1 = tmp;
}
w = x1 - x + 1;
h = y1 - y + 1;
xf = x * 12 / 8;
xt = (x + w - 1) * 12 / 8;
for (w += x; x < w; x++) {
lcd_vline(x, y, y1, 0, 0);
}
return 0;
}
int lcd_fillrect(short x1, short y1, short x2, short y2, int c)
{
return _lcd_fillrect(
(unsigned char *)0xc0000000,
x1,
y1,
x2,
y2,
c
);
}
static int lcd_putbigpixel(short x, short y, unsigned char c, int xorm){
lcd_fillrect(x-2, y-2, x+2, y+2, c);
return 0;
}
int lcd_ellipse(
short x,
short y,
short a,
short b,
unsigned char c,
int xorm
)
{
int wx, wy;
int thresh;
int asq = a * a;
int bsq = b * b;
int xa, ya;
lcd_putbigpixel(x, y+b, c, xorm);
lcd_putbigpixel(x, y-b, c, xorm);
wx = 0;
wy = b;
xa = 0;
ya = asq * 2 * b;
thresh = asq / 4 - asq * b;
for (;;) {
thresh += xa + bsq;
if (thresh > = 0) {
ya -= asq * 2;
thresh -= ya;
wy--;
}
xa += bsq * 2;
wx++;
if (xa > = ya)
break;
lcd_putbigpixel(x+wx, y-wy, c, xorm);
lcd_putbigpixel(x-wx, y-wy, c, xorm);
lcd_putbigpixel(x+wx, y+wy, c, xorm);
lcd_putbigpixel(x-wx, y+wy, c, xorm);
}
lcd_putbigpixel(x+a, y, c, xorm);
lcd_putbigpixel(x-a, y, c, xorm);
wx = a;
wy = 0;
xa = (bsq * a) < < 1;
ya = 0;
thresh = (bsq > > 2) - bsq * a;
for (;;) {
thresh += ya + asq;
if (thresh > = 0) {
xa -= bsq + bsq;
thresh = thresh - xa;
wx--;
}
ya += asq + asq;
wy++;
if (ya > xa)
break;
lcd_putbigpixel(x+wx, y-wy, c, xorm);
lcd_putbigpixel(x-wx, y-wy, c, xorm);
lcd_putbigpixel(x+wx, y+wy, c, xorm);
lcd_putbigpixel(x-wx, y+wy, c, xorm);
}
// return 0;
}
void lcd_clear(void)
{
{
unsigned char *base = (unsigned char *)0xc0000000;
int i;
for (i = 0; i < 320 * 240 * 12 /8 ; i++){
*base++ = 0x77;
}
}
}
// int main()
static int LCD_Driver(void)//_start()
{
lcd_setup(0xC0000000,240, 240, 320, 4);
lcd_clear();
lcd_ellipse(150,150,100,50,0,0);
// lcd_vline(122,20,165,0,0);
// lcd_fillrect(20,20, 200, 200, 0);
}
int c_entry(){
init_serial1();
puts1("LCD TEST\n");
LCD_Driver();
loop:
goto loop;
// return 0;[/B][/color]
第2个key程序:
#define SFR_BADDR 0x80000000
#define rSYSCON1 (*(volatile unsigned *)(SFR_BADDR + 0x0100))
#define rPADR (*(volatile unsigned char *)(SFR_BADDR + 0x0000))
#define rPADDR (*(volatile unsigned char *)(SFR_BADDR + 0x0040))
static unsigned char Keyvalue;
static unsigned char Function_Key_value;
static unsigned char value;
static unsigned char keyold;
static unsigned char keynew;
static unsigned char ckeynum;
void dly(int n)
{
int i, j;
for(i = 0; i < 1000; i++)
for(j = 0; j < n; j++);
}
unsigned char Key_Driver(void)
{
value = 0;
ckeynum = 0;
while(1)
{
rSYSCON1 &= ~0xf; // 键盘的第一列扫描
dly(10);
value = rPADR; // 得到PA口的值,当PA0,PA1,PA2,PA3其中为一时,表示有按键发生,按键
// 的行号即对应的PA几,列号就是1。本按键可支持同时按键。即支持带功能键
value &= 0xf;
if(value == 0)
{
keyold = 0;
break;
}
else
dly(100); //10ms????????????????????????
value = rPADR;
value &= 0xf;
if(value == 0)
{
keyold = 0;
break;
}
else
rSYSCON1 |= 0x8;
dly(10);
value = rPADR;
value &= 0xf;
if(value & 0x1)
{
keynew = 1;
ckeynum++;
}
if (value & 0x2)
{
keynew = 5;
ckeynum++;
}
if (value & 0x4)
{
keynew = 9;
ckeynum++;
}
if (value & 0x8)
{
keynew = 13;
ckeynum++;
}
rSYSCON1 &= ~0xf; // 键盘的第二列扫描
rSYSCON1 |= 0x9; // 键盘的第二列置高电平
dly(10);
value = rPADR;
value &= 0xf;
if (value & 0x01) // 第二列扫描开始
{
keynew = 2;
ckeynum++;
}
if (value & 0x2)
{
keynew = 6;
ckeynum++;
}
if (value & 0x4)
{
keynew = 10;
ckeynum++;
}
if (value & 0x8)
{
keynew = 14;
ckeynum++;
}
rSYSCON1 &= ~0xf; // 键盘的第三列扫描
rSYSCON1 |= 0xA; // 键盘的第三列置高电平
dly(10);
value = rPADR;
value &= 0xf;
if (value & 0x01) // 第三列扫描开始
{
keynew = 3;
ckeynum++;
}
if (value & 0x2)
{
keynew = 7;
ckeynum++;
}
if (value & 0x4)
{
keynew = 11;
ckeynum++;
}
if (value & 0x8)
{
keynew = 15;
ckeynum++;
}
rSYSCON1 &= ~0xf; // 键盘的第四列扫描
rSYSCON1 |= 0xB; // 键盘的第四列置高电平
dly(10);
value = rPADR;
value &= 0xf;
if (value & 0x01) // 第四列扫描开始
{
keynew = 4;
ckeynum++;
}
if (value & 0x2)
{
keynew = 8;
ckeynum++;
}
if (value & 0x4)
{
keynew = 12;
ckeynum++;
}
if (value & 0x8)
{
keynew = 16;
ckeynum++;
}
{
if(ckeynum == 1)
ckeynum = 0;
if(keyold != keynew)
{
keyold = keynew;
if(keynew==1)
puts1("Keyvalue =1\n");
else if(keynew ==2)
puts1("Keyvalue =2\n");
else if(keynew ==3)
puts1("Keyvalue =3\n");
else if(keynew ==4)
puts1("Keyvalue =4\n");
else if(keynew ==5)
puts1("Keyvalue =5\n");
else if(keynew ==6)
puts1("Keyvalue =6\n");
else if(keynew ==7)
puts1("Keyvalue =7\n");
else if(keynew ==8)
puts1("Keyvalue =8\n");
else if(keynew ==9)
puts1("Keyvalue =9\n");
else if(keynew ==10)
puts1("Keyvalue =10\n");
else if(keynew ==11)
puts1("Keyvalue =11\n");
else if(keynew ==12)
puts1("Keyvalue =12\n");
else if(keynew ==13)
puts1("Keyvalue =13\n");
else if(keynew ==14)
puts1("Keyvalue =14\n");
else if(keynew ==15)
puts1("Keyvalue =15\n");
else if(keynew ==16)
puts1("Keyvalue =16\n");
}
}
}
}
int c_entry(){
init_serial1();
puts1("KEY TEST\n");
loop:
Key_Driver();
goto loop;
return 0;
}