📄 project.lst
字号:
(0005) // Modified :
(0006) // Revision : V0.0
(0007) //******************************************************************************
(0008)
(0009) #include "app.h"
(0010)
(0011) //Task Control Block structure
(0012) typedef struct
(0013) {
(0014) INT16U wTimerPeriod;
(0015) INT16U wTimerCount;
(0016) INT16U wEvent;
(0017) }OS_TCB;
(0018)
(0019) //structure array definition
(0020) OS_TCB OSTCB[cMaxTask];
(0021)
(0022) //******************************************************************************
(0023) // Function : OS_Event_Pend
(0024) // Input : wTaskPrio - priority of task
(0025) // Output : event of task
(0026) // Description : Inquiry event of task indexed by priority and then clear it
(0027) //******************************************************************************
(0028) INT16U OS_Event_Pend(INT8U bTaskPrio)
(0029) {
(0030) INT16U wTaskEvent;
(0031) wTaskEvent = OSTCB[bTaskPrio].wEvent;
06B2 E086 LDI R24,6
06B3 9F80 MUL R24,R16
06B4 01F0 MOVW R30,R0
06B5 E184 LDI R24,0x14
06B6 E091 LDI R25,1
06B7 0FE8 ADD R30,R24
06B8 1FF9 ADC R31,R25
06B9 8140 LDD R20,Z+0
06BA 8151 LDD R21,Z+1
(0032) OSTCB[bTaskPrio].wEvent &= ~wTaskEvent;
06BB E086 LDI R24,6
06BC 9F80 MUL R24,R16
06BD 0110 MOVW R2,R0
06BE E184 LDI R24,0x14
06BF E091 LDI R25,1
06C0 0E28 ADD R2,R24
06C1 1E39 ADC R3,R25
06C2 012A MOVW R4,R20
06C3 9440 COM R4
06C4 9450 COM R5
06C5 01F1 MOVW R30,R2
06C6 8060 LDD R6,Z+0
06C7 8071 LDD R7,Z+1
06C8 2064 AND R6,R4
06C9 2075 AND R7,R5
06CA 8271 STD Z+1,R7
06CB 8260 STD Z+0,R6
(0033) return(wTaskEvent);
06CC 018A MOVW R16,R20
06CD 940E0E4C CALL pop_gset1
06CF 9508 RET
_OS_Event_Post:
wTaskEvent --> R20
bTaskPrio --> R22
06D0 940E0E60 CALL push_gset2
06D2 01A9 MOVW R20,R18
06D3 2F60 MOV R22,R16
(0034) }
(0035)
(0036) //******************************************************************************
(0037) // Function : OSEventSend
(0038) // Input : wTaskPrio - priority of task
(0039) // wTaskEvent - event to be sent
(0040) // Output : none
(0041) // Description : Send an event to task indexed by priority
(0042) //******************************************************************************
(0043) void OS_Event_Post(INT8U bTaskPrio,INT16U wTaskEvent)
(0044) {
(0045) OSTCB[bTaskPrio].wEvent |= (1 << wTaskEvent);
06D4 E086 LDI R24,6
06D5 9F86 MUL R24,R22
06D6 0110 MOVW R2,R0
06D7 E184 LDI R24,0x14
06D8 E091 LDI R25,1
06D9 0E28 ADD R2,R24
06DA 1E39 ADC R3,R25
06DB E001 LDI R16,1
06DC E010 LDI R17,0
06DD 019A MOVW R18,R20
06DE 940E0EA7 CALL lsl16
06E0 01F1 MOVW R30,R2
06E1 8040 LDD R4,Z+0
06E2 8051 LDD R5,Z+1
06E3 2A40 OR R4,R16
06E4 2A51 OR R5,R17
06E5 8251 STD Z+1,R5
06E6 8240 STD Z+0,R4
(0046) }
06E7 940E0E40 CALL pop_gset2
06E9 9508 RET
(0047)
(0048) //******************************************************************************
(0049) // Function : OS_Task_Create
(0050) // Input : wTaskPrio - priority of task
(0051) // wTimerPeriod - period of task
(0052) // Output : none
(0053) // Description : Set time period of a task to create it
(0054) //******************************************************************************
(0055) void OS_Task_Create(INT8U bTaskPrio,INT16U wTimerPeriod)
(0056) {
(0057) OSTCB[bTaskPrio].wTimerPeriod = wTimerPeriod;
_OS_Task_Create:
wTimerPeriod --> R18
bTaskPrio --> R16
06EA E086 LDI R24,6
06EB 9F80 MUL R24,R16
06EC 01F0 MOVW R30,R0
06ED E180 LDI R24,0x10
06EE E091 LDI R25,1
06EF 0FE8 ADD R30,R24
06F0 1FF9 ADC R31,R25
06F1 8331 STD Z+1,R19
06F2 8320 STD Z+0,R18
(0058) }
06F3 9508 RET
(0059)
(0060) //******************************************************************************
(0061) // Function : OS_Task_Start
(0062) // Input : wTaskPrio - priority of task
(0063) // wTimerCount - Initial time count of a task
(0064) // Output : none
(0065) // Description : Set initial time count of a task
(0066) //******************************************************************************
(0067) void OS_Task_Init(INT8U bTaskPrio,INT16U wTimerCount)
(0068) {
(0069) OSTCB[bTaskPrio].wTimerCount = wTimerCount;
_OS_Task_Init:
wTimerCount --> R18
bTaskPrio --> R16
06F4 E086 LDI R24,6
06F5 9F80 MUL R24,R16
06F6 01F0 MOVW R30,R0
06F7 E182 LDI R24,0x12
06F8 E091 LDI R25,1
06F9 0FE8 ADD R30,R24
06FA 1FF9 ADC R31,R25
06FB 8331 STD Z+1,R19
06FC 8320 STD Z+0,R18
(0070) }
06FD 9508 RET
_OS_Task_Switch:
bTemp --> R20
bTaskPrio --> R16
06FE 940E0E49 CALL push_gset1
(0071)
(0072) //******************************************************************************
(0073) // Function : OS_Task_Switch
(0074) // Input : wTaskPrio - priority of task
(0075) // Output : none
(0076) // Description : inquiry the task in ready status.if there's no ready task with
(0077) // priority higher than current one,the task would run
(0078) //******************************************************************************
(0079) INT16U OS_Task_Switch(INT8U bTaskPrio)
(0080) {
(0081) INT8U bTemp;
(0082) for(bTemp = 0;bTemp < bTaskPrio;bTemp++)
0700 2744 CLR R20
0701 C011 RJMP 0x0713
(0083) {
(0084) if(OSTCB[bTemp].wEvent != 0)
0702 E086 LDI R24,6
0703 9F84 MUL R24,R20
0704 01F0 MOVW R30,R0
0705 E184 LDI R24,0x14
0706 E091 LDI R25,1
0707 0FE8 ADD R30,R24
0708 1FF9 ADC R31,R25
0709 8020 LDD R2,Z+0
070A 8031 LDD R3,Z+1
070B 2022 TST R2
070C F411 BNE 0x070F
070D 2033 TST R3
070E F019 BEQ 0x0712
(0085) {
(0086) return(true);
070F E001 LDI R16,1
0710 E010 LDI R17,0
0711 C005 RJMP 0x0717
0712 9543 INC R20
0713 1740 CP R20,R16
0714 F368 BCS 0x0702
(0087) }
(0088) }
(0089) return(false);
0715 2700 CLR R16
0716 2711 CLR R17
0717 940E0E4C CALL pop_gset1
0719 9508 RET
_OS_Task_Update:
bTemp --> R20
071A 940E0E49 CALL push_gset1
(0090) }
(0091)
(0092) //******************************************************************************
(0093) // Function : OS_Task_Update
(0094) // Input : none
(0095) // Output : none
(0096) // Description : increase timercount of all tasks in each SYS clock ISR.if task
(0097) // is timeout,Kernel send a timer event to the task
(0098) //******************************************************************************
(0099) void OS_Task_Update(void)
(0100) {
(0101) INT8U bTemp;
(0102) for(bTemp = 0;bTemp < cMaxTask;bTemp++)
071C 2744 CLR R20
071D C030 RJMP 0x074E
(0103) {
(0104) OSTCB[bTemp].wTimerCount++;
071E E086 LDI R24,6
071F 9F84 MUL R24,R20
0720 0110 MOVW R2,R0
0721 E182 LDI R24,0x12
0722 E091 LDI R25,1
0723 0E28 ADD R2,R24
0724 1E39 ADC R3,R25
0725 01F1 MOVW R30,R2
0726 8180 LDD R24,Z+0
0727 8191 LDD R25,Z+1
0728 9601 ADIW R24,1
0729 8391 STD Z+1,R25
072A 8380 STD Z+0,R24
(0105) if(OSTCB[bTemp].wTimerCount == OSTCB[bTemp].wTimerPeriod)
072B E086 LDI R24,6
072C 9F84 MUL R24,R20
072D E180 LDI R24,0x10
072E E091 LDI R25,1
072F 01F0 MOVW R30,R0
0730 0FE8 ADD R30,R24
0731 1FF9 ADC R31,R25
0732 8020 LDD R2,Z+0
0733 8031 LDD R3,Z+1
0734 E182 LDI R24,0x12
0735 E091 LDI R25,1
0736 01F0 MOVW R30,R0
0737 0FE8 ADD R30,R24
0738 1FF9 ADC R31,R25
0739 8040 LDD R4,Z+0
073A 8051 LDD R5,Z+1
073B 1442 CP R4,R2
073C 0453 CPC R5,R3
073D F479 BNE 0x074D
(0106) {
(0107) OSTCB[bTemp].wTimerCount = 0;
073E E086 LDI R24,6
073F 9F84 MUL R24,R20
0740 01F0 MOVW R30,R0
0741 E182 LDI R24,0x12
0742 E091 LDI R25,1
0743 0FE8 ADD R30,R24
0744 1FF9 ADC R31,R25
0745 2422 CLR R2
0746 2433 CLR R3
0747 8231 STD Z+1,R3
0748 8220 STD Z+0,R2
(0108) OS_Event_Post(bTemp,0);
0749 2722 CLR R18
074A 2733 CLR R19
074B 2F04 MOV R16,R20
074C DF83 RCALL _OS_Event_Post
074D 9543 INC R20
074E 3042 CPI R20,2
074F F408 BCC 0x0751
0750 CFCD RJMP 0x071E
(0109) }
(0110) }
(0111) }
0751 940E0E4C CALL pop_gset1
0753 9508 RET
(0112)
(0113) //******************************************************************************
(0114) // Function : OS_Init
(0115) // Input : none
(0116) // Output : none
(0117) // Description : Initlization of TCBs
(0118) //******************************************************************************
(0119) void OS_Init(void)
(0120) {
(0121) INT8U bTemp;
(0122) for(bTemp = 0;bTemp < cMaxTask;bTemp++)
_OS_Init:
bTemp --> R16
0754 2700 CLR R16
0755 C01E RJMP 0x0774
(0123) {
(0124) OSTCB[bTemp].wTimerPeriod = 0;
0756 E086 LDI R24,6
0757 9F80 MUL R24,R16
0758 01F0 MOVW R30,R0
0759 E180 LDI R24,0x10
075A E091 LDI R25,1
075B 0FE8 ADD R30,R24
075C 1FF9 ADC R31,R25
075D 2422 CLR R2
075E 2433 CLR R3
075F 8231 STD Z+1,R3
0760 8220 STD Z+0,R2
(0125) OSTCB[bTemp].wTimerCount = 0;
0761 E086 LDI R24,6
0762 9F80 MUL R24,R16
0763 01F0 MOVW R30,R0
0764 E182 LDI R24,0x12
0765 E091 LDI R25,1
0766 0FE8 ADD R30,R24
0767 1FF9 ADC R31,R25
0768 8231 STD Z+1,R3
0769 8220 STD Z+0,R2
(0126) OSTCB[bTemp].wEvent = 0;
076A E086 LDI R24,6
076B 9F80 MUL R24,R16
076C 01F0 MOVW R30,R0
076D E184 LDI R24,0x14
076E E091 LDI R25,1
076F 0FE8 ADD R30,R24
0770 1FF9 ADC R31,R25
0771 8231 STD Z+1,R3
0772 8220 STD Z+0,R2
0773 9503 INC R16
0774 3002 CPI R16,2
0775 F300 BCS 0x0756
(0127) }
(0128) }
0776 9508 RET
(0129)
(0130) //******************************************************************************
(0131) // Function : OS_Start
(0132) // Input : none
(0133) // Output : none
(0134) // Description : Initlization of tasks and Start Kernel
(0135) //******************************************************************************
(0136) void OS_Start(void)
(0137) {
(0138) Task_Init();
_OS_Start:
0777 940E0DF0 CALL _Task_Init
(0139) Task_Start();
(0140) }
0779 940C0DF2 JMP _Task_Start
FILE: E:\Steaven2000\AVR\AVR_Book\PROGRA~1\SOURCE~1\Code\LCD菜单系统设计\LCD.c
(0001) //******************************************************************************
(0002) // File Name : LCD.c
(0003) // Author : Steaven
(0004) // Created : 2008-07-27
(0005) // Modified :
(0006) // Revision : V0.0
(0007) //******************************************************************************
(0008)
(0009) //PIN DESCRIPTION
(0010) //01 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20
(0011) //GND VCC V0 RS RW EN D0 D1 D2 D3 D4 D5 D6 D7 CS1 CS2 RST VEE BLA BLK
(0012) //GND +5V V0 PB0 PB1 PB2 PA0 PA1 PA2 PA3 PA4 PA5 PA6 PA7 PC6 PC5 PC7 VEE +5V GND
(0013)
(0014) #include "app.h"
(0015)
(0016) //constant definition
(0017) #define cLCD_X_MAX 64
(0018) #define cLCD_Y_MAX 128
(0019)
(0020) //variable defintion
(0021) INT16U wDataBaseLength; //database length
(0022)
(0023) //local functions declaration
(0024) void Set_DI(INT8U RS);
(0025) void Set_RW(INT8U RW);
(0026) void Set_EN(INT8U EN);
(0027) void Set_CS1(INT8U CS1);
(0028) void Set_CS2(INT8U CS2);
(0029) void Set_RST(INT8U RST);
(0030) void Set_Data(INT8U data);
(0031)
(0032) //******************************************************************************
(0033) // Function : Set_RS
(0034) // Input : RS - RS Control Line Level
(0035) // Output : none
(0036) // Description : LCD(1602) Low Level Interface Function
(0037) //******************************************************************************
(0038) void Set_DI(INT8U RS)
(0039) {
(0040) if(RS == 0)
_Set_DI:
RS --> R16
077B 2300 TST R16
077C F411 BNE 0x077F
(0041) {
(0042) PORTB &= ~0x01;
077D 98C0 CBI 0x18,0
(0043) }
077E C001 RJMP 0x0780
(0044) else
(0045) {
(0046) PORTB |= 0x01;
077F 9AC0 SBI 0x18,0
(0047) }
(0048) }
0780 9508 RET
(0049)
(0050) //******************************************************************************
(0051) // Function : Set_RW
(0052) // Input : RW - RW Control Line Level
(0053) // Output : none
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -