/* new command for 8051SBC */ #include <8051io.h> #include <8051reg.h> #define gpio1 (*((unsigned char *)0x0100)) #define gpio2 (*((unsigned char *)0x0200)) // user registers for saving after break programming running // prepared for assembly learning unsigned char rbuffer[30]; unsigned char i,j,temp,non_hex; unsigned char buffer[10]; char command; int temp16; unsigned char *dptr; //pointer to external RAM char *title = "\n\n8051SBC new commands (press ? for help or q to quit)"; char *prompt = "\n\n>>"; char *menu = "\n\nHelp Menu\nA ASCII Table\nD Dec2Hex\nR Read GPIO2\nQ Quit\nI i/o address\nB Binary image\n? help"; main() { putstr(title); sendprompt(); while(1) { command = chkchr(); /* run background task here */ print_help(); print_ascii(); dec2hex(); read_gpio2(); ioaddress(); binaryimage(); print_register(); quit(); prompting(); } } save_register() { asm{ PUSH PCON PUSH ACC PUSH B PUSH PSW PUSH DPL PUSH DPH PUSH 0 PUSH 1 PUSH 2 PUSH 3 PUSH 4 PUSH 5 PUSH 6 PUSH 7 PUSH IP PUSH IE PUSH SCON PUSH TCON PUSH TMOD PUSH P1 PUSH P3 MOV R7,#21 MOV DPTR,#rbuffer COPY POP A MOVX @DPTR,A INC DPTR DJNZ R7,COPY } } print_register() { if(command == 'u') { save_register(); putstr("print user regsiters"); printf("\n\n P3=%02x P1=%02x TMOD=%02x TCON=%02x SCON=%02x IE=%02x IP=%02x", rbuffer[0],rbuffer[1],rbuffer[2],rbuffer[3],rbuffer[4],rbuffer[5],rbuffer[6]); printf("\n R7=%02x R6=%02x R5=%02x R4=%02x R3=%02x R2=%02x R1=%02x R0=%02x", rbuffer[7],rbuffer[8],rbuffer[9],rbuffer[10],rbuffer[11],rbuffer[12],rbuffer[13],rbuffer[14]); printf("\n DPH=%02x DPL=%02x B=%02x ACC=%02x PCON=%02x", rbuffer[15],rbuffer[16],rbuffer[18],rbuffer[19],rbuffer[20]); printf("\n\n PSW= %08b \n PSW= CY AC F0 RS1 RS0 OV - P",rbuffer[17]); sendprompt(); } } print_ascii() { if (command== 'a') { putstr("printable ASCII code(hex), e.g. ASCII code of 'A' is 41"); ascii_table(); sendprompt(); } } ascii_table() { putstr("\n\n MSB"); for(i= 2; i<8; i++) printf(" %d",i); putch('\n'); putstr("LSB"); for(j=0; j<=15; j++) { printf("\n %1x ",j); for(i=2; i< 8; i++) { temp = i; temp <<=4; printf(" %c",temp|j); } } } quit() { if (command== 'q') { asm" LJMP 0"; } } sendprompt() { putstr(prompt); } prompting() { if (command == 13) { putstr(title); sendprompt(); } } dec2hex() { if (command== 'd') { putstr("Decimal to Hex converter"); putstr("\n\nenter decimal number = "); getstr(buffer,10); temp16=atoi(buffer); printf("Dec -> Hex -> Bin"); printf("\n%d -> %x -> %b",temp16,temp16,temp16); sendprompt(); } } read_gpio2() { if (command== 'r') { putstr("Read GPIO2 (8-bit input port)"); printf("\n\n%02x %08b",gpio2,gpio2); sendprompt(); } } ioaddress() { if (command== 'i') { putstr("i/o address decoded by PLD"); putstr("\n\nLCD command write 0x0000"); putstr("\nLCD data write 0x0001"); putstr("\nLCD command read 0x0002"); putstr("\nLCD data read 0x0003"); putstr("\nGPIO1 8-bit output port 0x0100"); putstr("\nGPIO2 8-bit input port 0x0200"); putstr("\nexpansion i/o space 0x0300-0x07FF"); sendprompt(); } } binaryimage() { if (command== 'b') { putstr("see how real program looks like"); putstr("\n\nenter address = "); dptr = gethex16(); putstr("\n\nA15............A0 D7.....D0"); for(i=0; i<16; i++) { printf("\n %016b %08b",dptr,*dptr); dptr++; } sendprompt(); } } char getbyte() // return BCD for DS1307 setting { char s[3]; /* two characters plus terminator */ int i; for (i = 0; i < 2; i++) /* read two characters then return value */ s[i] = putch(getch()); // echo to terminal s[i] = '\0'; return(((s[0]-0x30)<<4)|(s[1]-0x30)); // return BCD // return (_atoi(s)); // return binary } print_help() { if (command == '?') { putstr(menu); sendprompt(); } } gethex16() { int a,b; a = gethex(); b = gethex(); return((a<<8)|b); } gethex() { char a,b; a = putch(toupper(getch())); b = putch(toupper(getch())); a = convertASCII_HEX(a)<<4; b = convertASCII_HEX(b); return(a|b); } convertASCII_HEX(char c) { if (isdigit(c)) return(c-'0'); if((c>= 'A') && (c <= 'F')) return(c-55); non_hex = 1; }